Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代理实例如何将自身传递给调用处理程序?_Java_Proxy Classes - Fatal编程技术网

Java 代理实例如何将自身传递给调用处理程序?

Java 代理实例如何将自身传递给调用处理程序?,java,proxy-classes,Java,Proxy Classes,以下是代理类的方法签名: Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException 有人知道吗 谢谢您可以通过通常的方式提供参考。一种常见模式是创建一个最终变量来引用目标,并将InvocationTargetHandler的匿名实现传递给Proxy.new

以下是代理类的方法签名:

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


谢谢

您可以通过通常的方式提供参考。一种常见模式是创建一个最终变量来引用目标,并将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,我的问题是如何在设计中传递代理?因此,当我从invoke方法调用proxy.getClass.getName时,我得到了与我的代理相同的实例类名。@skystar7没问题!因此,如果我现在理解正确,您是在询问JRE在调用newProxyInstance时生成的字节码。如果深入研究JRE代码,您会发现一个名为sun.misc.ProxyGenerator的类。那个家伙为每个代理类生成字节码,这些代理类创建存根方法来调用代理处理程序。在这些存根方法中,代理参数的传递方式如下所示。
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);
        }
});