如何使用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是一个接口,您可以考虑使用动态代理 :

  1. 包裹原来的foo
  2. 拦截所有消息并将它们转发到原始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类不同,所以如果超级使用

  1. reflection
  2. instanceof
  3. 或直接访问实例变量(不通过getter / setter)

那么它可能会有问题。

希望我理解你的问题并且它有所帮助。