JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
简单实例:
要添加代理的类:ProxyImpl
package reflrction.proxy.staticState; import reflrction.proxy.ITestProxy; public class ProxyImpl implements ITestProxy { @Override @Override } |
cglib代理:CglibProxy
package reflrction.proxy.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; public class CglibProxy implements MethodInterceptor { private Object target; /** @Override |
主函数:CglibMain
package reflrction.proxy.cglib; import reflrction.proxy.staticState.ProxyImpl; public class CglibMain { /** } |
执行结果:
cglib代理开始 ProxyImpl test001>>>>>>>>>>>>>>>>>>>>>>>>>> 事cglib代理结束 cglib代理开始 ProxyImpl test002>>>>>>>>>>>>>>>>>>>>>>>>>> 事cglib代理结束 reflrction.proxy.staticState.ProxyImpl$$EnhancerByCGLIB$$763ce1c8 |
基本原理解析:
1.JDK的动态代理要求,有做代理的类必须实现一个接口,cglib不需要: 2.cglib使用了一个小而快的字节码处理框架ASM(Java字节码操控框架),来转换字节码并生成新的类: 3.原理都是生成原类的子类,对子类的方法重写: |