首页 > 代码库 > Cglib动态代理详解
Cglib动态代理详解
查阅了很多资料,这样理解起来好像可以一起呵成,不知道有没有什么地方不对,有的话希望大家指导一下
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
示例 :
Jar 包 : cglib-2.2.jar, asm-all-3.1 Helloworld 方法 package com.greysh.cglib; public class HelloWorld { public void say() { System.out.println("Hello World"); } }
回调类(我把它叫做拦截类)因为它实现了MethodIntercept接口,该接口我翻译一下就是 “ 方法拦截 "
package com.greysh.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor { @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("Before Helloworld~"); methodProxy.invokeSuper(object, args); System.out.println("After Helloworld~"); return null; } }
测试类
package com.greysh.cglib; import net.sf.cglib.proxy.Enhancer; public class TestCglib { public static void main(String[] args) { Enhancer enhancer = new Enhancer();//创建加强类(其实就是代理类的雏形),这是我根据单词意思理解的 //代理类需要继承委托类,(使用的是继承实现代理) enhancer.setSuperclass(HelloWorld.class); //加强类设置回调对象来拦截代理对象方法调用,拦截到后,用这个回调对象的intercept方法增强原方法调用,(也就是添加一些操作) enhancer.setCallback(new CglibProxy()); HelloWorld helloWorld = (HelloWorld) enhancer.create();//创建代理对象(这里的helloWorld才叫做代理对象) helloWorld.say(); } }
过程是这样的:先创建一个拦截类实现methodIntercept接口,再创建一个加强类(代理类雏形)enhancer,,调用setSuperclass()来继承委托类,使用setCollback(this),设置回调对象,其实设置这个对象的目的就是用来拦截的,
设置了前面两个属性后,加强类enhancer调用create()方法,就完成了化蝶,成为代理对象,代理对象在调用say()时,被回调对象拦截,进而调用回调对象的intercept(),来实现 在原方法调用的前后 添加操作
Cglib动态代理详解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。