记和同事间关于动态代理的争论

争论的过程是一个逐渐统一意见的过程,互相纠正对方的盲点,最终得出一个一致的结论。

动态代理本质上就是运行时加载类,有两种动态代理,一个是JDK自带的动态代理,另一个是cglib动态代理,比较一下两者:

JDK动态代理本质上是操作接口,利用反射机制和ClassForName()运行时加载一个类,由于是JDK自带的,所以随着JDK版本升级,JDK动态代理自然也会平滑的适应。

cglib动态代理本质上是操作一个类,利用字节码操作机制,运行时加载类,由于不是JDK自带的,所以可能会出现与JDK版本不适配的情况,即不稳定,但是字节码操作机制效率要高一点。

不论哪种方法,动态代理本质上都是运行时去加载一个类,即.class文件都是已经被编译好的,但是还没有被加载到JVM中,我们争论的焦点之一也是运行时加载还是运行时编译。顺便理清一个关系,JDK是JAVA开发环境包含JRE和编译器等开发工具,JRE是JAVA运行环境包含JVM等,所以编译操作是在JVM之外进行的。

后来聊到AOP,Spring的AOP是利用JDK动态代理实现的,梳理了为什么要用AOP,因为@注解的时候会传参数进去,这就可以在运行时加载类的时候去完成不同的初始化这个类,进而达到代码复用的目的。

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/84261007