我想监听方法调用,以便在调用周围动态附加附加行为。我已经在带有自定义批注和运行器的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。