2014-12-05 62 views
1

我有一個javassist的小問題,用方法處理器裝飾類。問題是方法處理程序在Abc類中與method1正常工作,但不會攔截Def內部類中對method2的調用。Javassist和命名的內部類

public class Abc { 

    Def def; 

    public Abc() { 
    this.def = new Def(); 
    } 

    public void method1() {} 

    public static class Def { 

    public void method2() {} 
    } 
} 

簡單了Javassist處理

ProxyFactory factory = new ProxyFactory(); 
factory.setSuperclass(Abc); 
Class<?> clazz = factory.createClass(); 
MethodHandler handler = new MethodHandler() { 

    @Override 
    public Object invoke(final Object self, final Method overridden, final Method forwarder, final Object[] args) 
     throws Throwable { 
    ... 
    } 
}; 
ProxyObject instance = (ProxyObject) clazz.newInstance(); 
instance.setHandler(handler); 
return (Abc) instance; 

我怎樣才能讓我的處理方法也趕上方法2調用?

謝謝。

回答

1

內部類只是定義兩個類的語法糖,其中一個名爲Abc,另一個名爲Abc$Def。爲了代理Def類的method2,您需要像Abc類一樣代理它。

我假設你在Abc類的某處創建了一個Def實例,並且想要代理creared實例的方法。在這種情況下,請在Abc中創建一個factroy方法,並使用工廠方法返回代理Def