本案例讲的是动态代理的原理,代理模式时GOF23种设计模式中的一种,JDK本身通过一个接口提供了对代理的支持.
这个接口就是InvocationHandler(handler的意思是句柄),注意代理模式与JAVA的反射机制联系紧密,看本案例之前,请复习反射相关的内容.
以下为核心代码
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Myhandler implements InvocationHandler {
private Object targetObject;
public Object getProxy(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
// 注意此方法不是由coder调用,而是由JVM调用.
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
beforeLog();
result = method.invoke(targetObject, args);
afterLog();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void beforeLog() {
System.out.println("前置通知");
}
public void afterLog() {
System.out.println("后置通知!");
}
}
记住代理模式的一句话,表面上你使用的那个东西,并不是真正为你提供服务的.代理与AOP关系紧密,AOP就是靠代理者模式实现的.
方法的解释:
1. getproxy是得到代理对象实例的方法,并不属于invocation handler这个接口.该接口只有一个方法invoke();
代理模式应用广泛,希望看到本文的人都能掌握.