2011-06-07 26 views
4

是否可以使用AspectJ在本地方法調用上設置切入點?我嘗試以下方面:AspectJ - 在本地方法調用上的切入點

public aspect EmailAspect { 
    pointcut conn() : call(* java.net.PlainSocketImpl.socketConnect(..)); 
    before() : conn() { 
     System.out.println("Connecting"); 
    } 
} 

但它不起作用。我也沒有通過谷歌搜索找到很多相關信息(除了這http://blog.jayway.com/2007/02/16/static-mock-using-aspectj,但不清楚是否有可能&如何做到這一點)。

我試圖在Eclipse中調試我的測試代碼(它只連接到一些TCP本地端口)並且eclipse停在socketConnect()斷點處。

謝謝。

UPDATE

這可能是原因:

AspectJ - Load-time weaving, privileged aspect and pointcut on private method of JRE class

回答

2

PlainSocketImpl是由JDK提供的罐子,對不對?您可能會發現有關weaving into jars有幫助的問題。顯然,在你編織你的方面之後,你需要記住使用編織的罐子而不是原始的。

+0

對不起,我忘了提,我不想使用源代碼編織,因爲我不希望包括全JDK在我的編譯代碼(我用加載時織入)。我認爲問題在於socketConnect()是封裝私有的,方面沒有特權。 – batto 2011-06-07 17:06:47

+0

@batto這聽起來像是一個可能的罪魁禍首。道歉,我有很多方面的理論,但沒有實踐經驗。 – Atreys 2011-06-07 17:11:49

1

如果this e-mail爲真,那麼一旦某個方法被聲明爲native,Java將編寫直接跳轉到底層C++/C機器代碼的字節碼。這意味着AspectJ沒有什麼可以攔截,無論是編譯時間,後期編譯時間還是加載時織入。

+0

這看起來確實如此。我自己測試了它。電子郵件中提出的方面爲我工作。 – 2012-05-31 08:04:40