2012-03-30 293 views
1

我需要攔截對接口的所有方法調用的調用。我已經瀏覽了Java Dynamic Proxies,但是這對我無能爲力。我甚至不確定這是否可以實現,但想到確認。Java攔截對接口的調用方法

所以基本上可以說,我有一個界面如下:

public interface Foo {   
    public String getValue(); 
} 

我想從富取其實現攔截所有的getValue()調用。問題是我不能控制Foo的不同實現,因爲我不能使用Dynamic Proxies。

有沒有辦法可以做到這一點?

謝謝。

+0

也許如果您使用Abstract.class而不是Interface,您將能夠實現由每個子getValue() – 2012-03-30 11:43:37

回答

1

AOP可能會有所幫助,但正如您發現的那樣,如果您控制對象創建(即使只通過像DI或者Spring這樣的DI框架),它們都會變得更加容易。

另一種替代方法是編譯時字節碼編織 - 即查找所有實現並更改它們以在編譯時在其中編寫攔截代碼。

第三種方法是在類加載到系統中時使用代理或自定義類加載器來編織。這是加載時織造。但是,如果你在一個Web容器中,你不能完全掌控類加載器,這可能會很棘手。

1

要做到這一點的唯一方法是使用自定義類加載器,它用代理替換實現類。

可能有可能通過Spring AOP的加載時編織方式進行此開箱即用的操作。

+0

所調用的私有方法感謝您的回覆。這一切看起來太複雜了,我的瑣碎的想法。有一個更簡單的例子,你可以指向我。 – user320550 2012-03-30 12:19:44