这是Proxy类的方法签名:
Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
我检查了Proxy Class中newProxyInstance的源代码,我无法找到代理对象将自身传递给InvocationHandler方法的位置
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
有人知道吗?
谢谢
答案 0 :(得分:8)
您可以通过常规手段提供参考。一种常见的模式是创建一个最终变量来引用目标,并将InvocationTargetHandler
的匿名实现传递给Proxy.newProxyInstance
方法,如下所示:
final Object myObject = /*initialize the proxy target*/;
final Object proxy = Proxy.newProxyInstance(
classLoader,
new Class[] { /*your interface(s)*/ },
new InvocationTargetHandler() {
public Object invoke(Object proxy, Method method, Object[] args) {
return method.invoke(myObject, args);
}
});
这个例子是世界上最无意义的代理,因为它可以在不做任何事情的情况下修补所有方法调用,但是你可以用各种有趣的东西填充InvocationTargetHandler
。
有时候API感觉有点笨拙,因为代理对象不构成合同的一部分,但是JDK作者想要提供代理类存在的可能性,而不需要支持具体实现。他们这样做是非常有用的......单元测试中的模拟对象就是一个很好的例子。