这样和妻子解释:Java动态代理机制详解(JDK和CGLIB( 六 )
仔细观察可以看出生成的动态代理类有以下特点:
1.继承自 java.lang.reflect.Proxy , 实现了 Rechargable,Vehicle 这两个ElectricCar实现的接口;
2.类中的所有方法都是final 的;
3.所有的方法功能的实现都统一调用了InvocationHandler的invoke()方法 。
文章插图
cglib 生成动态代理类的机制----通过类继承:
JDK中提供的生成动态代理类的机制有个鲜明的特点是: 某个类必须有实现的接口 , 而生成的代理类也只能代理某个类接口定义的方法 , 比如:如果上面例子的ElectricCar实现了继承自两个接口的方法外 , 另外实现了方法bee() ,则在产生的动态代理类中不会有这个方法了!更极端的情况是:如果某个类没有实现接口 , 那么这个类就不能同JDK产生动态代理了!
幸好我们有cglib 。 “CGLIB(Code Generation Library) , 是一个强大的 , 高性能 , 高质量的Code生成类库 , 它可以在运行期扩展Java类与实现Java接口 。 ”
cglib 创建某个类A的动态代理类的模式是:
1. 查找A上的所有非final的public类型的方法定义;2. 将这些方法的定义转换成字节码;3. 将组成的字节码转换成相应的代理的class对象;4. 实现MethodInterceptor接口 , 用来处理对代理类上所有方法的请求(这个接口和JDK动态代理InvocationHandler的功能和角色是一样的)
一个有趣的例子:定义一个Programmer类 , 一个Hacker类
package samples;/*** 程序猿类* @author louluan*/public class Programmer {public void code(){System.out.println("I'm a Programmer,Just Coding.....");}}package samples;import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/** 实现了方法拦截器接口*/public class Hacker implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("**** I am a hacker,Let's see what the poor programmer is doing Now...");proxy.invokeSuper(obj, args);System.out.println("****Oh,what a poor programmer.....");return null;}}package samples;import net.sf.cglib.proxy.Enhancer;public class Test {public static void main(String[] args) {Programmer progammer = new Programmer();Hacker hacker = new Hacker();//cglib 中加强器 , 用来创建动态代理Enhancer enhancer = new Enhancer();//设置要创建动态代理的类enhancer.setSuperclass(progammer.getClass());// 设置回调 , 这里相当于是对于代理类上所有方法的调用 , 都会调用CallBack , 而Callback则需要实行intercept()方法进行拦截enhancer.setCallback(hacker);Programmer proxy =(Programmer)enhancer.create();proxy.code();}}程序执行结果:
文章插图
让我们看看通过cglib生成的class文件内容:
package samples;import java.lang.reflect.Method;import net.sf.cglib.core.ReflectUtils;import net.sf.cglib.core.Signature;import net.sf.cglib.proxy.Callback;import net.sf.cglib.proxy.Factory;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class ProgrammerEnhancerByCGLIBfa7aa2cd extends Programmerimplements Factory{//......省略private MethodInterceptor CGLIB$CALLBACK_0;// Enchaner传入的methodInterceptor// ....省略public final void code(){MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;if (tmp4_1 == null){tmp4_1;CGLIB$BIND_CALLBACKS(this);//若callback 不为空 , 则调用methodInterceptor 的intercept()方法}if (this.CGLIB$CALLBACK_0 != null)return;//如果没有设置callback回调函数 , 则默认执行父类的方法super.code();}//....后续省略}
- 中国|浅谈5G移动通信技术的前世和今生
- 芯片|华米GTS2mini和红米手表哪个好 参数功能配置对比
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 华为|台积电、高通、华为、小米接连宣布!美科技界炸锅:怎么会这样!
- 二维码|村网通?澳大利亚一州推出疫情追踪二维码 还考虑采用人脸识别和地理定位
- 不到|苹果赚了多少?iPhone12成本不到2500元,华为和小米的利润呢?
- 机器人|网络里面的假消息忽悠了非常多的小喷子和小机器人
- 华为|骁龙870和骁龙855区别都是7nm芯片吗 性能对比评测
- 花15.5亿元与中粮包装握手言和 加多宝离上市又进一步?|15楼财经 | 清远加多宝
- 究竟|免费的OPPO R1电视究竟怎么样
