动态代理

来源:互联网 发布:杭州商学院网络 编辑:程序博客网 时间:2024/04/27 12:12

动态代理:

       动态代理,我的理解,效果上 就是对原来的函数 增加处理逻辑,而不改变原来的代码。需要代理的类包括两种方式,一种是有实现接口的类,一种是没有实现接口的类。

      前一种:jdk1.3以后就有实现,后一种通过CGLIB(http://cglib.sourceforge.net)实现。CGLIB的原理是对类的字节码进行修改,重新生成新的字节码(和重新编写代码,编译差不多,区别就是减少了多余的代码);

接口动态代理的例子:

//商业接口

public interface BusinessInterface {
 public void processBusiness();
}

//商业接口实现类

public class BusinessObject implements BusinessInterface {

 private Logger logger = Logger.getLogger(this.getClass().getName());
 public void processBusiness(){
  //business processing
  System.out.println(“here is business logic”);
 }
}  

//动态代理类
public class LogHandler implements InvocationHandler {

 private Logger logger = Logger.getLogger(this.getClass().getName());
  private Object delegate;
  public LogHandler(Object delegate){
   this.delegate = delegate;
  }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  Object o = null;
  try {
   logger.info("method stats..." + method);
   o = method.invoke(delegate,args);
   logger.info("method ends..." + method);
  } catch (Exception e){
   logger.info("Exception happends...");
   //excetpion handling.
  }
  return o;
 }
}  

//动态代理调用
BusinessInterface businessImp = new BusinessObject();

InvocationHandler handler = new LogHandler(businessImp);

BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance(
 businessImp.getClass().getClassLoader(),
 businessImp.getClass().getInterfaces(),
 handler);

proxy.processBusiness();