当前位置: 首页 > 面试题库 >

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

经骁
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 我想知道如何在Quartz中从外部传递实例变量? 下面是我想写的伪代码。如何将externalInstance传递给此Job? 问题答案: 您可以将您的实例放在schedulerContext中。要计划作业时,可以在执行以下操作之前: 您的工作类别如下: 如果您使用的是Spring,那么您实际上可以使用spring的支持来注入整个applicationContext,就像在Link中回

  • 问题内容: 我是新来提升python的人。我必须先在cpp代码中初始化一个cpp类实例,然后将此cpp实例传递给python代码,然后使用python类实例来调用它(cpp实例)。我已经尝试了Python / C API的方式,但是失败了,所以我想知道如何将c ++类实例传递给python类。 以下是我的代码,从boost python演示更改了。 在main.cpp中 在python.py中 在

  • 问题内容: 我试图将我的数据库对象传递给我的处理程序,而不是具有全局对象。但是我不知道这是否可行,我使用的是Gorilla Mux软件包,我可以看到它把闭包作为第二个参数。 然后定义了我可以使用的参数,理想情况下,我希望拥有这样的第三个参数。 有解决方法吗?还是我需要一个全局数据库对象?我是Go的新手,所以请详细说明可能的答案。 问题答案: 欢迎来到。 可以使用全局变量,特别是数据库对象。 但是,

  • 我正在使用GAE部署我的应用程序,我想把一些环境变量传递给我的GAE实例。例如,每次我使用DB时,分配当前是这样的: 这很好,但问题是它是一个共享代码,每次有人进行本地测试时,它都会更改路径,并将更改推送到存储库。当有人拉动新的更改时,它需要更改以发出db请求,因为每个人都有不同的套接字更改路径。因此,我创建了以下声明: 因此,如果某个人的系统中有一个环境变量,那么它会接受该变量并避免绝对路径。问

  • 如果问题中使用的术语不正确,请与我一起,因为这是我第一次使用react JS。我通过参考大量的博客、youtube、文档等编写了一些代码,现在我被困住了,因为它是所有东西的混合体。 我需要对一个endpoint(关于.js组件)进行get调用,该endpoint返回json数据,这些数据将被传递给(workspace.js组件),在那里呈现和显示这些数据。到目前为止,它运行良好。 下一步,有一个链

  • 我是一个相当新的反应,这是一个我正在努力解决的问题。