如何使用AOP拦截参数中的super方法调用?
我正在扩展一个类并重写一个方法。 我想要做的就是调用super,但是调用一个被修改的参数可以调用其方法之一。 一个例子使它更清楚:
// Foo is an interface and also this method is part of an interface @Override public void foo(Foo foo) { // I want to intercept the call to foo.bar() in super super.foo(foo); }
我宁愿使用一个不需要自己编译器的工具。 什么是最佳的?
鉴于Foo
是一个接口,您可以考虑使用动态代理 :
- 包裹原来的foo
- 拦截所有消息并将它们转发到原始foo
上面的链接中有一个完整的例子 。 这是一个想法:
public class DebugProxy implements java.lang.reflect.InvocationHandler { private Object obj; private DebugProxy(Object obj) { this.obj = obj; } public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { System.out.println("before method " + m.getName()); return m.invoke(obj, args); } } Foo original = ... ; Foo wrapper = (Foo) java.lang.reflect.Proxy.newProxyInstance( original.getClass().getClassLoader(), original.getClass().getInterfaces(), new DebugProxy(original)); wrapper.bar(...);
请注意,如果Foo
不是接口,您仍然可以子类化Foo
并手动覆盖所有方法以转发它们。
class SubFoo extends Foo { Foo target; SubFoo( Foo target ) { this.target = target }; public void method1() { target.method1(); } ... }
这是伪代码,我还没有测试过。 在这两种情况下,包装器都允许您拦截super
的呼叫。
当然,包装器与原始Foo
类不同,所以如果超级使用
- reflection
-
instanceof
- 或直接访问实例变量(不通过getter / setter)
那么它可能会有问题。
希望我理解你的问题并且它有所帮助。