我在这里阅读了有关代理的示例: http://docs.oracle.com/javase/1.3/docs/guide/reflection/proxy.html
如您所见,未使用'invoke'方法中的参数'proxy'。代理用于什么?为什么不在这里使用它:result = m.invoke( proxy ,args); ?
public class DebugProxy implements java.lang.reflect.InvocationHandler {
private Object obj;
public static Object newInstance(Object obj) {
return java.lang.reflect.Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new DebugProxy(obj));
}
private DebugProxy(Object obj) {
this.obj = obj;
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable
{
Object result;
try {
System.out.println("before method " + m.getName());
result = m.invoke(obj, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: " +
e.getMessage());
} finally {
System.out.println("after method " + m.getName());
}
return result;
}
}
答案 0 :(得分:2)
代理是由JVM“动态代理”类专门构造的。您的代码无法直接调用它的方法。考虑这个的另一种方法是代理是“接口”,在其上调用任何方法对应于调用public Object invoke(Object proxy, Method m, Object[] args)
方法,因此在代理上调用方法将以无限循环结束。