【问题标题】:How the proxy instance pass itself to the InvocationHandler?代理实例如何将自身传递给 InvocationHandler?
【发布时间】:2012-12-05 05:32:36
【问题描述】:

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

有人知道吗?

谢谢

【问题讨论】:

    标签: java proxy-classes


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的回复,我的问题不是如何将代理 obj 传递给 InvocationTargetHandler,我的问题是代理是如何在设计中传递的?因此,当我从调用方法调用 proxy.getClass().getName() 时,我得到了与代理相同的实例类名。
    • @skystar7 没问题!因此,如果我现在理解正确,您是在询问 JRE 在您调用 newProxyInstance 时生成的字节码。如果您深入研究 JRE 代码,您会发现一个名为 sun.misc.ProxyGenerator 的类。那家伙为每个代理类生成字节码,这些代理类创建存根方法来调用您的代理处理程序。在这些存根方法中,proxy 参数只是作为this 传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2011-11-22
    相关资源
    最近更新 更多