今天给同事简单的演示了一下JDK的代理写法,在此也把代码贴出来,作为一个学习笔记。
动态代理的核心思想是不修改原有类和方法的基础上能添加一些功能,Spring的AOP是一个经典实现。好了,废话不多说,上代码。
第一段代码是一个接口,没什么好说的。
public interface Handler {
public void handle();
}
下面一段代码是具体实现类,我们要代理的也是这个类,实现比较简单。
public class MyHandler implements Handler{
public void handle(){
System.out.println("myHandler................");
}
}
下面代码是我们真正的核心,具体的Proxy类。这个类继承于InvocationHandler,只有一个方法,invoke方法。第一个参数我开始还以为是代理的具体类,就是我下面要引入的myHandler,后来发现其实是这个类本身。所以这个类在这里没有多大用处,第二个参数很好理解,具体代理类的代理方法,第三个就是参数了。代理类中传进具体的代理类myHandler。
public class ProxyHandler implements InvocationHandler{
private MyHandler myHandler;
public void setMyHandler(MyHandler myHandler) {
this.myHandler = myHandler;
}
/* (non-Javadoc)
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
System.out.println("method:"+method.getName()+",proxy:"+method.getDeclaringClass().getName());
method.invoke(myHandler, args);
System.out.println("after");
return null;
}
}
开始写Client端代码了。
public class Client {
public static void main(String[] args){
MyHandler myHandler = new MyHandler();
ProxyHandler ph = new ProxyHandler();
ph.setMyHandler(myHandler);
Handler proxy = (Handler) Proxy.newProxyInstance(Client.class.getClassLoader(), new Class<?>[]{Handler.class}, ph);
proxy.handle();
}
}
最后看看具体的输出。
before
method:handle,proxy:com.example.proxy.Handler
myHandler................
after