编程语言
首页 > 编程语言> > java-代理实例如何将自身传递给InvocationHandler?

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

作者:互联网

这是Proxy类的方法签名:

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

我检查了Proxy类中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的作者希望为代理类提供可能性,而无需支持具体的实现.他们这样做是非常有用的……单元测试中的模拟对象就是一个很好的例子.

标签:proxy-classes,java
来源: https://codeday.me/bug/20191010/1883169.html