美文网首页
代理模式

代理模式

作者: 剑书藏于西 | 来源:发表于2018-11-05 19:42 被阅读0次

1、JDK动态代理:

JDK动态代理是实现InvocationHandler接口,然后利用反射新建一个原始类的代理类。

public class JdkProxy implements InvocationHandler {
    private Object target;  // 原始类对象
    public JdkProxy(Object target) {
        this.target = target;
    }

    public void log(Method m) {
        System.out.println(m.getName() + " start");
    }

    /* 
     * proxy 代理对象(一般用不到)
     * method 代理对象要执行的方法
     * args 所需执行方法的参数
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        log(method);    //在执行方法前添加逻辑
        method.invoke(target , args);
        return null;
    }
}
public class TestProxy {
        /*
         * userDAO : 原始对象,实现了UserDAO接口
         * jdkProxy : 给代理添加逻辑的类,最终调用的方法是jdkProxy的invoke()
         * proxy : 通过Proxy的静态方法生成的代理对象
         * 代理对象与原始对象的ClassLoader要一样
         * 通过传入的参数,实现与代理对象同样的接口(或者说代理类是原始类的子类)
         */
         public void testProxy() {
             // new原始对象
             UserDAO userDAO = new UserDAOImpl();

             //将原始对象交给代理类
             JdkProxy jdkProxy = new JdkProxy(userDAO);

             //Proxy.newProxyInstance产生代理对象
             UserDAO proxy = (UserDAO)Proxy.newProxyInstance(
                  userDAO.getClass().getClassLoader(),
                  UserDAO.class.getInterfaces(), 
                  jdkProxy);
             proxy.save(); // 会调用invoke()方法
        }
}

2、CGLib动态代理

JDK Proxy只能代理实现了接口的类,没有实现接口的类就不能实现JDK代理了。这时候就需要CGLib动态代理类,这里需要注意的是实现MethodIntercetor接口,必须导入cglib-nodep-2.1_3.jar这个包。CGLib是针对类来实现代理的,他的原理是对指定的目标生成一个子类。

public class CglibProxy implements MethodInterceptor {
    
    private CglibProxy() {}
    
    public static <T extends Foo> Foo newProxyInstance(Class<T> targetInstanceClazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetInstanceClazz);
        enhancer.setCallback(new CglibProxy());
        return (Foo) enhancer.create();
    }

    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        return proxy.invokeSuper(obj, args);
    }
}

相关文章

  • 设计模式

    单例模式 模板方法模式 工厂模式 代理模式 静态代理 JDK动态代理

  • 设计模式

    单例模式 代理模式 静态代理 jdk动态代理 cglib动态代理 工厂模式 适配器模式 建造者模式 观察者模式

  • kube-proxy的3种模式

    userspace代理模式 iptables代理模式 IPVS代理模式 https://kubernetes.io...

  • 第4章 结构型模式-代理模式

    一、代理模式简介 二、代理模式3个角色 三、代理模式的优点 四、代理模式的实例(游戏代练)

  • 理解代理模式

    原创博客地址 简介 代理模式,也叫做委托模式,分为:静态代理动态代理 代理模式也是平时比较常用的设计模式之一,代理...

  • 结构型 代理模式(文末有项目连接)

    1:什么是代理模式 2:没用代理模式时的实例 3:使用代理模式将其解耦(静态代理) 3:使用代理模式将其解耦(动态...

  • 设计模式-动态代理模式

    之前介绍了代理模式,大家也都了解了代理模式,不过之前介绍的代理模式是静态代理,静态代理什么意思?静态代理指的是代理...

  • 代理模式

    一、什么是代理模式 代理模式(Proxy pattern):代理模式又叫委托模式,是为某个对象提供一个代理对象,并...

  • 设计模式之代理模式(Proxy模式)

    代理模式的引入 代理模式的实例程序 代理模式的分析 代理模式的引入 Proxy是代理人的意思,指的是代替别人进行工...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

网友评论

      本文标题:代理模式

      本文链接:https://www.haomeiwen.com/subject/necexqtx.html