代理实例如何将自身传递给InvocationHandler?

这是Proxy类的方法签名:

Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) throws IllegalArgumentException 

我检查代理类中newProxyInstance的源代码,我找不到代理对象将自己传递给InvocationHandler方法的位置

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; 

有人知道吗?

谢谢

您可以通过常规手段提供参考。 一种常见的模式是创建一个最终变量来引用目标,并将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作者希望提供代理类存在的可能性,而无需支持具体实现。 他们这样做是非常有用的……unit testing中的模拟对象就是一个很好的例子。