1. 程式人生 > 其它 >Java proxy 子類代理

Java proxy 子類代理

技術標籤:java

Producer.java

package com.claroja.cglib;

/**
 * 一個生產者
 */
public class Producer {

    /**
     * 銷售
     * @param money
     */
    public void saleProduct(float money){
        System.out.println("銷售產品,並拿到錢:"+money);
    }

    /**
     * 售後
     * @param money
     */
    public
void afterService(float money){ System.out.println("提供售後服務,並拿到錢:"+money); } }

Client.java

package com.claroja.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 模擬一個消費者
 */
public class Client { public static void main(String[] args) { final Producer producer = new Producer(); /** * 動態代理: * 特點:位元組碼隨用隨建立,隨用隨載入 * 作用:不修改原始碼的基礎上對方法增強 * 基於子類的動態代理: * 涉及的類:Enhancer * 提供者:第三方cglib庫 * 如何建立代理物件: * 使用Enhancer類中的create方法 * 建立代理物件的要求: * 被代理類不能是最終類 * create方法的引數: * Class:位元組碼 * 它是用於指定被代理物件的位元組碼。 * * Callback:用於提供增強的程式碼 * 它是讓我們寫如何代理。我們一般都是些一個該介面的實現類,通常情況下都是匿名內部類,但不是必須的。 * 此介面的實現類都是誰用誰寫。 * 我們一般寫的都是該介面的子介面實現類:MethodInterceptor */
Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() { /** * 執行北地阿里物件的任何方法都會經過該方法 * @param proxy * @param method * @param args * 以上三個引數和基於介面的動態代理中invoke方法的引數是一樣的 * @param methodProxy :當前執行方法的代理物件 * @return * @throws Throwable */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //提供增強的程式碼 Object returnValue = null; //1.獲取方法執行的引數 Float money = (Float)args[0]; //2.判斷當前方法是不是銷售 if("saleProduct".equals(method.getName())) { returnValue = method.invoke(producer, money*0.8f); } return returnValue; } }); cglibProducer.saleProduct(12000f); } }