zoukankan      html  css  js  c++  java
  • jdk动态代理与cglib优势劣势以及jdk动态代理为什么要interface

    先来看一下jdk动态代理原型:

            IUserDao target = new UserDao();
    
            // 给目标对象,创建代理对象
            IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
    
            // 执行方法   【代理对象】
            proxy.save();
    

    第一个结论:其本质与cglib同,都是生成一个子类来模拟“代理”

    但是:

    动态代理实际上是程序在运行中,根据被代理的接口来动态生成代理类的class文件,并加载class文件运行的过程,通过反编译被生成的$Proxy0.class文件发现:
    class类定义为:
    public final class $Proxy0 extends Proxy implements Interface {
        public $Proxy0(InvocationHandler paramInvocationHandler) { 
        super(paramInvocationHandler); 
    }
    

    由于这个子类要继承Proxy类获得有关方法,而java是单继承的,那么就不能再继承被代理类了,这是第二个结论:jdk动态代理为什么要接口

    那么为什么要继承Proxy类呢?

    因为Proxy内部维护一个InvocationHandler对象进行invoke aop操作,这是第三个结论

    而cglib使用asm更直接,直接修改字节码进行增强子类,故被代理类不能是final的,这是第四个结论

    那么为什么不能由Proxy生成代理类的字节码,在代理类中定义一个变量并传入InvocationHandler对象的引用,而非继承Proxy呢?目前是调用父类的构造函数并使用子类传给父类的InvocationHandler来调用invoke,这个问题待续

  • 相关阅读:
    Flex的DateChooser组件中文显示方法
    FLEX XML XMLList XMLListCollection ArrayCollection相互转换
    开机电脑cpu占用100%
    FLEX 动态绑定chart 数据
    FLEX 数组 转化成 xml
    FLEX 通过url 得到网页内容 xml通信
    FLEX 时间计算
    FlEX 如何调试
    unix,linux,windows 哪个更好,更适合做服务器
    FLEX httpService 用法介绍
  • 原文地址:https://www.cnblogs.com/silyvin/p/11558909.html
Copyright © 2011-2022 走看看