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

Java:如何在不显式注册每个对象的情况下侦听方法调用?

龙嘉誉
2023-03-14
问题内容

我想监听方法调用,以便在调用周围动态附加附加行为。我已经在带有自定义批注和运行器的JUnit方法上完成了此操作。我正在尝试在标准的Java应用程序上执行此操作。

主要思想是:

@Override
public void beforeInvoke (Object self, Method m, Object[] args){
   Object[] newargs = modifyArgs (args);
   m.invoke (self, newargs);
}

这只是一个抽象的想法,我没有任何具体的示例,但是我很好奇Java中是否可能。

我发现了一些方法:

java.lang.reflect.Proxy.newProxyInstance(...)

其中仅为接口定义了代理(但不用于装饰具体类)。似乎与注入模式相似,这是一个不同的关注点。

这里的另一种方法是将工厂模式与ProxyFactory类一起使用。此其他解决方案需要显式调用create()方法,以产生侦听方法调用的对象代理。因此,如果您通过使用类的自然构造函数绕过它,那么它将无法正常工作。如果每次必须创建一个对象时都必须显式调用工厂,这将非常有约束力。

有办法做到透明吗?像Proxy.newProxyInstance()一样,但也可以在具体类上工作吗?

谢谢。


问题答案:

嗯,这在Spring框架和面向方面的编程中很常见。由于将构造函数调用委托给Spring,因此Spring放置代理以拦截对实际对象的调用非常容易。

据我所知,拦截呼叫的唯一方法是使用代理。可以采用您提到的方式,也可以使用Spring和AOP。



 类似资料:
  • 问题内容: 我在Go中创建了Direct3D9包装器,该包装器使用CGo与C中的COM对象进行接口。 我想摆脱Windows下对C编译器的依赖,因此用户不必安装MinGW或Cygwin即可使用Go中的DirectX。 问题在于d3d9.dll不会公开C函数,而是使用COM。加载DLL(带有)后,可以直接调用的唯一函数是。这将返回一个COM对象,该对象将所有功能公开为方法。 如何在没有CGo的纯Go

  • 下面是我对kafka侦听器的方法定义,如果接收空或空的有效负载字符串,我想我会得到下面的错误...你能帮帮我吗。

  • 我试图模拟一个方法,从另一个方法调用,而不使用类对象。在指定的代码中,我想模拟methodA(),它调用methodB(),而不使用对象。 我无法更改现有类中的任何内容。 我已经尝试过: 莫基托。doReturn(“id”)。当(反对)。方法b(员工)

  • 我正在实现一个排序列表类,在这个类中,我将对任何类型的对象进行排序,所以现在我想测试对象是否具有可比性, 我用这段代码覆盖了compareTo()方法:- 所以现在我需要给这些对象分配数字,像这样 但它总是给我一个例外:- 线程“main”中出现异常Java . lang . classcastexception:Java . lang . integer不能转换为java.lang.String

  • 这是一个使用合并排序的程序,从1到1000对1000个数字的列表进行排序。它显示原始列表,然后调用递归方法对其进行排序,然后显示。 代码中我不明白的是这两行: 合并排序(数字,低,中);//在方法中,它会说“这里” 合并排序(数字,中间1,高); 我是java的初学者,这与我所学的一切背道而驰,因为我无法理解如何在方法中调用方法。除非它是一个我怀疑的对象。有人能解释一下这两行代码的作用吗?

  • 问题内容: 我正在寻找一种从方法中获取Method对象的便捷解决方法。这个想法: 一种明显的方法是将方法的名称用作字符串: 但我想避免这种情况,因为如果我重命名foo(),该代码将停止工作,或者在所有使用该字符串的地方都重命名了该字符串。 用例是我想使用类似于ProperyChangeListeners的东西,但是那些依赖于方法名的字符串。我想(安全地)使用实际方法而不依赖字符串。 我可以使用什么