CGLIB动态代理代码实例

java动态代理(cglib)

  • 博客分类: 
  • java
 

java提供的基于Proxy、InvocationHandler的动态代理由于只能创建接口的代理对象,在实际应用中不能很好的满足需要,针对这个问题,另外一个开源框架cglib提供了一种实现方式,可以针对类进行代理对象的创建。

cglib官方网站:http://sourceforge.net/projects/cglib/files/

另外cglib依赖于asm(http://asm.ow2.org/)。

 

cglib使用示例:

 

HelloWorld.java

Java代码   收藏代码
  1. public class HelloWorld{  
  2.       
  3.     public String sayHello(String name){  
  4.         System.out.println("执行sayHello()");  
  5.         return "hello,"+name;  
  6.     }  
  7. }  

 

 拦截器MyMethodInterceptor.java

Java代码   收藏代码
  1. import java.lang.reflect.Method;  
  2. import net.sf.cglib.proxy.MethodInterceptor;  
  3. import net.sf.cglib.proxy.MethodProxy;  
  4.   
  5. public class MyMethodInterceptor implements MethodInterceptor{  
  6.   
  7. /*  
  8. * obj 代理对象实例  
  9. * method 源对象的方法名  
  10. * args 传递给方法的实际入参  
  11. * proxyMethod 与源对象中的method相对应的代理对象中的方法  
  12. */   
  13.     public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {  
  14.           
  15.         System.out.println("执行方法"+method+"前");  
  16.           
  17.         //执行源对象的method方法  
  18.         Object returnValue = proxy.invokeSuper(obj, args);  
  19.           
  20.         System.out.println("执行方法"+method+"后");  
  21.           
  22.         return returnValue;  
  23.     }  
  24.   
  25. }  

 

 

代理工厂ProxyFactory.java

Java代码   收藏代码
  1. import net.sf.cglib.proxy.Enhancer;  
  2.   
  3.   
  4. public class ProxyFactory {  
  5.   
  6.     /* 
  7.      * 获得代理对象 
  8.      */  
  9.     public static Object getProxyObj(String clazz) throws Exception{  
  10.           
  11.         Class<?> superClass = Class.forName(clazz);  
  12.           
  13.         Enhancer hancer = new Enhancer();  
  14.           
  15.         //设置代理对象的父类  
  16.         hancer.setSuperclass(superClass);  
  17.           
  18.         //设置回调对象,即调用代理对象里面的方法时,实际上执行的是回调对象(里的intercept方法)。  
  19.         hancer.setCallback(new MyMethodInterceptor());  
  20.           
  21.         //创建代理对象  
  22.         return hancer.create();  
  23.     }     
  24. }  

 测试类:

Java代码   收藏代码
  1. public class Test {  
  2.   
  3.     public static void main(String[] args) {  
  4.   
  5.         try {  
  6.             HelloWorld hello = (HelloWorld) ProxyFactory.getProxyObj(HelloWorld.class.getName());  
  7.             System.out.println(hello.sayHello("huangqiqing"));  
  8.         } catch (Exception e) {  
  9.             e.printStackTrace();  
  10.         }  
  11.     }  
  12. }  

 

输出结果:

执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)前
执行sayHello()
执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)后
hello,huangqiqing
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable前
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值