关键词搜索

源码搜索 ×
×

CGlib的动态代理使用示例

发布2013-10-13浏览7850次

详情内容

1、cglib简述

           Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类,使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理:

使用CGLIB需要导入以下两个jar文件:

    $1:    asm.jar – CGLIB的底层实现

    $2:   cglib.jar – CGLIB的核心jar包。

CGLIB的核心类:

    net.sf.cglib.proxy.Enhancer – 主要的增强类

    net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现

    net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:

    Object o = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环的问题。

2、简单的cglib代理使用

前述:Person 类和Dog类都有一个方法叫做avtive(); Dog的avtive()方法来实现自IAnimal接口。

  1. package com.boonya.proxy.cglib;
  2. import java.lang.reflect.Method;
  3. import net.sf.cglib.proxy.Enhancer;
  4. import net.sf.cglib.proxy.MethodInterceptor;
  5. import net.sf.cglib.proxy.MethodProxy;
  6. public class CglibObjectProxy {
  7. @SuppressWarnings("rawtypes")
  8. public static Object ceateProxtObject(final Object object,Class clazz) {
  9. // 声明增加类实例
  10. Enhancer en = new Enhancer();
  11. // 设置被代理类字节码,CGLIB根据字节码生成被代理类的子类
  12. en.setSuperclass(clazz);
  13. // 设置回调函数,即一个方法拦截
  14. en.setCallback(new MethodInterceptor() {
  15. @Override
  16. public Object intercept(Object arg0, Method method, Object[] args,
  17. MethodProxy arg3) throws Throwable {
  18. // 注意参数object,仍然为外部声明的源对象,且Method为JDK的Method反射
  19. Object o = method.invoke(object, args);
  20. return o;
  21. }
  22. });
  23. return en.create();
  24. }
  25. public static void main(String[] args) {
  26. // 未实现接口的类的代理
  27. Person proxyPerson=(Person) CglibObjectProxy.ceateProxtObject(new Person(),Person.class);
  28. proxyPerson.active("Talk with sb.");
  29. // 实现接口的类的代理
  30. IAnimal proxyDog=(IAnimal) CglibObjectProxy.ceateProxtObject(new Dog(),Dog.class);
  31. proxyDog.active("Dog lying ...........");
  32. }
  33. }
3、优化封装cglib的使用对象

  1. package com.boonya.proxy.cglib;
  2. import java.lang.reflect.Method;
  3. import net.sf.cglib.proxy.Enhancer;
  4. import net.sf.cglib.proxy.MethodInterceptor;
  5. import net.sf.cglib.proxy.MethodProxy;
  6. public class CglibProxy implements MethodInterceptor {
  7. private Object srcTarget;
  8. private CglibProxy(Object o) {
  9. this.srcTarget = o;
  10. }
  11. @SuppressWarnings("unchecked")
  12. public static <T> T proxyTarget(T t) {
  13. Enhancer en = new Enhancer();
  14. en.setSuperclass(t.getClass());
  15. en.setCallback(new CglibProxy(t));
  16. T tt = (T) en.create();
  17. return tt;
  18. }
  19. @Override
  20. public Object intercept(Object obj, Method method, Object[] args,
  21. MethodProxy proxy) throws Throwable {
  22. Object o = method.invoke(srcTarget, args);
  23. return o;
  24. }
  25. public static void main(String[] args) {
  26. // 未实现接口的类的代理
  27. Person person = CglibProxy.proxyTarget(new Person());
  28. person.active("Tom speaking ........");
  29. // 实现接口的类的代理
  30. IAnimal dog = CglibProxy.proxyTarget(new Dog());
  31. dog.active("Dog is running.........");
  32. }
  33. }

参考地址: http://www.open-open.com/lib/view/open1335662371030.html

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载