JDK代理
生成步骤
生成代理类,传入类加载器, 获取被代理类的所有的接口以及执行处理<br>器
jdk动态代理类重新生成一个新的类,同时新的类要实现被代理类实现<br>的所有接口
编译新生成的class文件,重新利用类加载器加载后运行
特点
JDK代理的目标对象必须要实现接口,因为JDK代理是根据被代理对<br>象的所有接口去生成新的方法
CGLB代理
生成步骤
创建被代理的类及方法
创建一个实现接口 MethodInterceptor 的代理类,重写 intercept 方<br>法
创建获取被代理类的方法 getInstance(Object target)
获取代理类,调用代理类方法
特点
CGLib代理的不需要被代理对象实现任何接口,它会重写被代理类的所有方<br>法,所以不能代理final修饰的方法或者类
JDK动态代理跟CGLib动态代理的区别
JDK动态代理通过反射去实现被代理对象的所有接口,所以JDK只能代理<br>实现了接口的对象,CGLlib对代理类所有方法重写,所以private的方法<br>都不能被代理,不是所有的方法都能被代理
JDK动态代理跟CGLib代理都是在运行期生成新的字节码,但是CGLib实<br>现更为复杂,用的是ASM框架,生成代理类的效率比JDK低
JDK动态代理是通过反射机制去查询所有被代理对象的接口,CGLib代<br>理是通过FastClass机制直接调用方法,所有执行效率,CGLib比JDK代<br>理要高