Java 設計模式之代理模式動態代理

動態道理分爲 cglib 和jdk  我們先看jdk

public interface OrderService {
    /**
     *抽象的共同方法
     */
    void order() throws Throwable;
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkInvocationHandler implements InvocationHandler {
    /**
     * 被代理的對象  ,目標代理對象
     */
    private Object target;

    public JdkInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("---執行日誌代碼START"+proxy.getClass().toString());
        Object result = method.invoke(target, args);
        System.out.println("---執行日誌代碼END");
        return result;
    }

    /**
     * 使用jdk動態代理創建代理類
     *
     * @param <T>
     * @return
     */
    public <T> T getProxy() {
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
}
Cglib 方式 
引入 pom 
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.2.12</version>
</dependency>


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

import java.lang.reflect.Method;

public class CglibMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println(">>>Cglib 日誌手機START---");
        methodProxy.invokeSuper(o,objects);
        System.out.println(">>>Cglib 日誌手機END---");
        return null;
    }
}

 

測試代碼

 

 

public class client {

    public static void main(String[] args) throws Throwable {

        /**
         * 動態代理 jdk的動態代理爲什麼用父類進行接受 , 因爲生成的代理類一般都是接口形式,代理類必須實現接口
         */
        System.getProperties().put("sum.misc.ProxyGenerator.saveGeneratedFiles","true");
        OrderService orderService = new JdkInvocationHandler(new OrderServiceImpl()).getProxy();
        orderService.order();

        /**
         * 動態代理 Cglib方式
         */
        CglibMethodInterceptor cglibMethodInterceptor = new CglibMethodInterceptor();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(OrderServiceImpl.class);
        enhancer.setCallback(cglibMethodInterceptor);
        OrderServiceImpl orderService = (OrderServiceImpl) enhancer.create();
        orderService.order();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章