您的位置:首页 >新闻资讯 > 正文

JAVA实现CGLIB动态代理的教程

来源:互联网 作者:admin 时间:2019-10-15 16:17:12

  之前ET代理介绍过JAVA代理模式类型,相关阅读:JAVA代理模式有哪些?静态代理我们已经了解过了,现在让我们来认识一下动态代理。


JAVA实现CGLIB动态代理


  JAVA动态代理的实现:


  动态代理是程序在运行过程中在JVM内部动态产生的代理对象,代理类可以实现对多种类的代理。动态代理又分为两种:JDK动态代理和CGLIB动态代理。


  首先我们来看看CGLIB动态代理。


  cglib动态代理也需要一个产生代理对象的中间类,此类需实现MethodInterceptor接口,此接口在cglib包中,目前已经被spring整合,在spring-core核心包中产生代理对象的中间类。


  import java.lang.reflect.Method;

  import org.springframework.cglib.proxy.Enhancer;

  import org.springframework.cglib.proxy.MethodInterceptor;

  import org.springframework.cglib.proxy.MethodProxy;

  public class CglibProxy implements MethodInterceptor {

  private Object target; //持有目标对象的引用

  public CglibProxy(Object target){

  this.target = target;

  }

  //创建代理对象

  public Object createProxy(){

  Enhancer enhancer = new Enhancer(); //1.创建Enhancer

  enhancer.setSuperclass(target.getClass()); //2.传递目标对象的class

  enhancer.setCallback(this); //3.设置回调操作(相当于InvocationHanlder)

  return enhancer.create();

  }

  //相当于InvocationHanlder中的invoke

  @Override

  public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

  long startTime = System.currentTimeMillis();

  System.out.println("开始记录时间");

  Object ret = method.invoke(target, args);//执行目标对象方法,此处写target如果写proxy会死循环直到内存溢出

  long endTime = System.currentTimeMillis();

  System.out.println("保存用户信息方法耗时" + (endTime-startTime) + "毫秒");

  return ret;

  }

  }


  客户端:


  public class ProxyTest {

  @Test

  public void test1() {

  UserService userService = new UserServiceImpl(); //1.创建目标对象

  CglibProxy factory = new CglibProxy(customerService); // 2.通过CglibProxy完成代理对象创建

  UserService userServiceProxy = (UserService)factory.createProxy();

  userServiceProxy.saveUser(new User("1","张三"));

  }

  }


  产生代理对象字节码,用JD.exe反编译如下:


  import java.lang.reflect.Method;

  import org.springframework.cglib.core.ReflectUtils;

  import org.springframework.cglib.core.Signature;

  import org.springframework.cglib.proxy.Callback;

  import org.springframework.cglib.proxy.Factory;

  import org.springframework.cglib.proxy.MethodInterceptor;

  import org.springframework.cglib.proxy.MethodProxy;

  public class UserServiceImpl$$EnhancerByCGLIB$$1772a9ea extends UserServiceImpl implements Factory {

  ...

  public final void saveUser(User paramUser)

  {

  MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;

  if (tmp4_1 == null){

  tmp4_1;

  CGLIB$BIND_CALLBACKS(this);

  }

  if (this.CGLIB$CALLBACK_0 != null) return;

  super.saveUser(paramUser);

  }

  ...

  }


  以上是CGLIB动态代理的介绍内容,如果你还想要知道JDK动态代理是怎么一回事,那么就请继续留意ET代理的更新了。


相关文章内容简介