鑑於Foo
是一個接口,你可以考慮使用一個dynamic proxy那會:
- 裹原富
- 攔截所有消息,並將其轉發到原來的富
有在上面的鏈接中是完整的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
,因此,如果超直接使用
- 反射
instanceof
- 或訪問實例變量(不通過的getter/setter去)
,那麼它可能有問題。
希望我明白你的問題是正確的,它有幫助。
就是這樣。我在想方式太難的解決方案。感謝您將我帶回地面。 – hleinone 2010-04-15 16:10:59