小编典典

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

java

我想监听方法调用,以便在调用周围动态附加附加行为。我已经在带有自定义批注和运行器的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()一样,但也可以在具体类上工作吗?

谢谢。


阅读 213

收藏
2020-11-30

共1个答案

小编典典

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

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

2020-11-30