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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章