cglib 生成动态代理类的机制

本文介绍了Cglib动态代理的实现原理,包括如何通过类继承生成代理类、方法拦截等,并提供了一个具体的示例,展示了程序员类和黑客类之间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


      转自  http://blog.youkuaiyun.com/luanlouis/article/details/24589193


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类

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package samples;  
  2. /** 
  3.  * 程序猿类 
  4.  * @author louluan 
  5.  */  
  6. public class Programmer {  
  7.   
  8.     public void code()  
  9.     {  
  10.         System.out.println("I'm a Programmer,Just Coding.....");  
  11.     }  
  12. }  

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package samples;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import net.sf.cglib.proxy.MethodInterceptor;  
  6. import net.sf.cglib.proxy.MethodProxy;  
  7. /* 
  8.  * 实现了方法拦截器接口 
  9.  */  
  10. public class Hacker implements MethodInterceptor {  
  11.     @Override  
  12.     public Object intercept(Object obj, Method method, Object[] args,  
  13.             MethodProxy proxy) throws Throwable {  
  14.         System.out.println("**** I am a hacker,Let's see what the poor programmer is doing Now...");  
  15.         proxy.invokeSuper(obj, args);  
  16.         System.out.println("****  Oh,what a poor programmer.....");  
  17.         return null;  
  18.     }  
  19.   
  20. }  

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package samples;  
  2.   
  3. import net.sf.cglib.proxy.Enhancer;  
  4.   
  5. public class Test {  
  6.   
  7.     public static void main(String[] args) {  
  8.         Programmer progammer = new Programmer();  
  9.           
  10.         Hacker hacker = new Hacker();  
  11.         //cglib 中加强器,用来创建动态代理  
  12.         Enhancer enhancer = new Enhancer();    
  13.                  //设置要创建动态代理的类  
  14.         enhancer.setSuperclass(progammer.getClass());    
  15.                // 设置回调,这里相当于是对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实行intercept()方法进行拦截  
  16.                 enhancer.setCallback(hacker);  
  17.                 Programmer proxy =(Programmer)enhancer.create();  
  18.                 proxy.code();  
  19.           
  20.     }  
  21. }  
程序执行结果:

让我们看看通过cglib生成的class文件内容:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package samples;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import net.sf.cglib.core.ReflectUtils;  
  5. import net.sf.cglib.core.Signature;  
  6. import net.sf.cglib.proxy.Callback;  
  7. import net.sf.cglib.proxy.Factory;  
  8. import net.sf.cglib.proxy.MethodInterceptor;  
  9. import net.sf.cglib.proxy.MethodProxy;  
  10.   
  11. public class Programmer
    EnhancerByCGLIB
    fa7aa2cd extends Programmer  
  12.   implements Factory  
  13. {  
  14.    //......省略  
  15.   private MethodInterceptor CGLIB$CALLBACK_0;  // Enchaner传入的methodInterceptor  
  16.    // ....省略  
  17.   public final void code()  
  18.   {  
  19.     MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;  
  20.     if (tmp4_1 == null)  
  21.     {  
  22.       tmp4_1;  
  23.       CGLIB$BIND_CALLBACKS(this);//若callback 不为空,则调用methodInterceptor 的intercept()方法  
  24.     }  
  25.     if (this.CGLIB$CALLBACK_0 != null)  
  26.       return;  
  27.       //如果没有设置callback回调函数,则默认执行父类的方法  
  28.       super.code();  
  29.   }  
  30.    //....后续省略  
  31. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值