0

这是 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;

有人知道吗?

谢谢

4

1 回答 1

8

你有责任通过通常的方式提供参考。一种常见的模式是创建一个 final 变量来引用目标并将匿名实现传递InvocationTargetHandlerProxy.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 作者希望提供代理类在没有支持具体实现的情况下存在的可能性。他们这样做非常有用……单元测试中的模拟对象就是一个很好的例子。

于 2012-12-04T21:25:44.030 回答