动态代理的内部原理请探知 : 本博http://blog.csdn.net/robbyo/article/details/18701861等系列文章
15.5 动态代理
Java 中如果想实现动态代理机制,则需要 java.lang.reflect.InvocationHandler 接口 interface 和 java.lang.reflect.Proxy
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
}
Moveable
public interface Moveable {
void move();
}
Tank 真实主题
public class Tank implements Moveable {
@Override
public void move() {
System.out.println("Tank move......");
}
}
MyInvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Author: libin.chen@qunar.com Date: 14-6-13 21:33
* 要想完成动态代理,首先定义一个 InvocationHandler 接口的子类,以完成代理的具体操作
*/
public class MyInvocationHandler implements InvocationHandler {
private Object object; // 真实主题
public Object bind(Object object) { // 绑定真实操作主题
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
// newProxyInstance 生成 并 取得 代理对象
}
@Override
/** 以下 invoke 为 动态调用方法 */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Transaction Start");
Object temp = method.invoke(this.object, args); //调用方法 传入真实主题和参数
System.out.println("Transaction End");
return temp; // 返回方法的返回信息
}
}
DynaProxyDemo Main
public class DynaProxyDemo {
public static void main(String[] args) {
MyInvocationHandler handler = new MyInvocationHandler(); // 实例化代理操作类
Moveable moveable = (Moveable)handler.bind(new Tank());
moveable.move();
}
}
输出 :
Transaction Start
Tank move......
Transaction End
Process finished with exit code 0
你会发现,神奇般的 invoke 被调用,动态代理内部原理,请探知 本博http://blog.csdn.net/robbyo/article/details/18701861等系列文章,老师 : 马士兵