标签:handle code 实测 public 字节码 and obj 代理技术 width
转自:http://www.cnblogs.com/yulinfeng/p/7811965.html
在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理。
JDK提供:
CGLIB:
从Proxy.newProxyInstance开始,来研究JDK是如何生成代理类的。
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
该方法有3个参数,了解JVM类加载的可能知道确定为同一个类需要有2个条件:
类的全限定名称相同
加载类的类加载器相同
要想生成目标对象的代理首先就要确保其类加载器相同,所以需要将目标对象的类加载器作为参数传递;其次JDK动态代理技术需要代理类和目标对象都继承自同一接口,所以需要将目标对象的接口作为参数传递;最后,传递InvocationHandler,这是主角,因为我们对目标对象的增强逻辑在这个实现类中,传递该对象使得代理类能够对其进行调用。
在Proxy.newProxyInstance方法中创建代理类的过程主要有3步:
在开头提到了CGLib的性能比JDK高,这实际上并不准确。或许这在特别条件下的确如此,因为在我实测发现JDK8的动态代理效率非常高,甚至略高于CGLib,但是在JDK6的环境下的效率就显得比较低了。所以,通常所说的CGLib性能比JDK动态代理要高,是传统的挂念,实际上Java一直都在不断优化动态代理性能,在比较高版本的JDK条件下可以放行大胆的使用JDK原生的动态代理。
标签:handle code 实测 public 字节码 and obj 代理技术 width
原文地址:https://www.cnblogs.com/jiataoq/p/9447891.html