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

Java: How to listen on methods invocation without registering each object explicitely?

我想监听方法调用以便在调用周围动态附加额外的行为。我已经使用自定义注释和运行程序在 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(...) 

其中代理仅为接口定义(但不用于装饰具体 classes)。看起来和注入模式很像,是不同的关注点。

另一种方法here 使用带有 ProxyFactory 的工厂模式 class。这个其他解决方案需要显式调用 create() 方法来生成监听方法调用的对象代理。因此,如果您使用 classes 的自然构造函数绕过它,它就不起作用。如果每次必须创建对象时都必须显式调用工厂,这是非常受限的。

有透明的方法吗? 喜欢 Proxy.newProxyInstance() 但也在具体 classes ?

上工作

谢谢。

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

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

我觉得cglib让你具体类.

据我所知,没有简单的方法可以拦截在具体 class 上调用的方法调用。 如前所述,您可以在编译期间(如在 AOP 中使用的那样)或在 class 加载时(如在 cglib 中使用的那样)操作字节码。 类 的另一个工具是 jmockit (http://jmockit.org/)。通常我只会在测试环境中而不是在生产环境中使用这种特殊的黑魔法。

您可以采用的另一种方法是注释处理。它在编译过程中工作。您必须编写一个处理器,它将遍历您的源代码并生成包含原始代码以及您需要的增强方法调用的源代码。 根据您需要增强的源代码量,此方法可能是个好主意,但通常需要大量工作。 这是 link (https://deors.wordpress.com/2011/10/08/annotation-processors/)。 尽管它通常与注释结合使用,但这并不是严格要求。