我正在学习java动态代理,这是我的代码:
//interface Move.java
public interface Move {
public void testMove();
}
然后是实现类
public class Tank implements Move{
public void testMove() {
System.out.println("test in Tank");
}
}
后跟
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MoveHandler implements InvocationHandler{
private Object target;
public MoveHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("in MoveHandler");
Object ret;
try {
ret = method.invoke(target, args);
}catch (Exception e) {
e.printStackTrace();
throw e;
}
System.out.println("after MoveHandler");
return ret;
}
}
测试类
public class Main {
public static void main(String[] args) {
Move test = new Tank();
MoveHandler proxy = new MoveHandler(test);
Move real = (Move) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), proxy);
real.testMove();
}
}
当我运行主类时,我可以获得正确的结果。如果我将 method.invoke(target, args)
更改为 method.invoke(proxy, args)
,将会出现数千行异常和错误。 invoke(Object proxy, Method method, Object[] args)
中参数 proxy 的用法是什么?如何正确使用它?
最佳答案
代理参数是由 Proxy.newProxyInstance()
返回的对象,在该对象上调用实际方法 (testMove()
)。您通常不需要它,但例如,可能有必要知道代理实现了哪些接口(interface)。
在此参数上调用方法是一个非常糟糕的主意,因为它基本上执行递归方法调用:您调用代理上的方法,该方法调用调用处理程序,该方法调用代理上的方法,后者调用处理程序,等等
关于java动态代理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571227/