鉴于Foo 是一个接口,您可以考虑使用dynamic proxy,它会:
- 包装原来的foo
- 截取所有消息并转发给原始foo
上面的链接中有一个完整的example。这只是想法:
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的类不一样,所以如果super使用了
- 反思
instanceof
- 或直接访问实例变量(不通过 getter/setter)
,那么可能有问题。
希望我能正确理解您的问题并且对您有所帮助。