动态代理:
动态代理,我的理解,效果上 就是对原来的函数 增加处理逻辑,而不改变原来的代码。需要代理的类包括两种方式,一种是有实现接口的类,一种是没有实现接口的类。
前一种: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();