一. 问题背景
面试题可能会问到AOP,然后其中涉及了动态代理,所以描述完了aop实现了哪些功能后,最好回答一下jdk动态代理和cglib代理的区别
参考自:
二. 两者的区别
jdk动态代理是生成一个目标类的代理类,而且代理类必须实现 目标类实现的接口,所以如果目标类没有实现接口的话,使用jdk动态代理可能不太合适,因为它生存不了代理类。jdk动态代理是通过反射实现的,反射比一般的函数开销要大一点,所以性能上可能稍微慢一点。
cglib代理是生成目标类的子类,cglib会使用字节码的一个编译器(也就是ASM,ASM能够改造既有类,直接生成需要的代码。增强的代码是硬编码在新生成的类文件内部。没有反射代理性能上的付出),在性能上cglib创建对象的过程中,可能就是做的更慢一些,但是运行时效率可能会高一些。
在jdk1.6、1.7的时候,jdk代理的性能可能比cglib的速度要慢;但是在jdk1.8时,jdk代理比cglib的速度快很多了。