首页 > 技术文章 > 关于动态代理

sxpy-lj 2017-06-25 10:11 原文

---恢复内容开始---

  动态代理是相对于静态代理来说的,相比于后者,前者能够增强代码的复用性,可以处理一类对象。

  动态代理两种分别是JDK动态代理和Cglib动态动态代理:

  前者要求代理类对象和委托类实现相同的接口,否则不能生成代理对象,而且指定方法较为麻烦。代码如下:

  public class Proxy{

    //获取代理对象的静态方法

    public static Object getProxy(final Object target , final TranactionManager tx){

    //利用target参数获取类加载器,真实对象类上的接口和指定接口,创建代理对象     

    Object  proxy = Proxy.NewInstance(target.getClass().getClassLoader , target.getClass().getInterfaces() , new InvocationHandler( ){

         //当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法

          @override

          public Object invoke(Object proxy,Method method , Object[] args) throws throwable{

        tx.begin();

        method.invoke(target,args);

        tx.commit();

        } 

      });

return  proxy;   

    }

  }

  后者不管有无接口都可以实现代理对象,生成的代理对象时目标对象的子类

public class DynamicProxy {
 
 //获取代理对象
 public static Object getProxy(final Object target,final TranactionManager tx){
  
  //增强器   底层操作的是二进制码
  Enhancer enhancer = new Enhancer();
  
  //设置接口
  enhancer.setInterfaces(target.getClass().getInterfaces());
  
  //设置父类
  enhancer.setSuperclass(target.getClass());

  //创建代理对象
  return enhancer.create();
  
  //设置回调  代理对象调用方法时,此方法进行拦截,进入到此方法中

//当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
  enhancer.setCallback(new MethodInterceptor() { 
   @Override
   public Object intercept(Object proxy, Method method, Object[] args,
     MethodProxy methodProxy) throws Throwable {
    
    tx.begin();
    //调用真实对象的方法
    Object result = method.invoke(target, args);
    tx.commit();
    
    return result;
   }
  });
  

  
 }
}

  

---恢复内容结束---

推荐阅读