簡體   English   中英

AspectJ與toString()

[英]AspectJ vs. toString()


public pointcut myToString() : within(mypackage.*) 
&& execution(public String toString());

String around(): myToString(){
    System.out.println("myToString");
    return proceed();
}

它只有在我嘗試編織的類Im中覆蓋toString時才有效,是否有任何方法可以使它適用於所有toString方法?

它不起作用,因為within()只匹配包中的執行,但是你繼承了toString()方法,除非你明確聲明它。

編輯:我看了一下,cflow也無法正常工作。 在沒有加載時編織的情況下,我無法看到另一種方法,但這需要記錄對toString()的所有調用,這是一個非常糟糕的主意。 使用return super.toString()簡單地在所有方法中聲明toString()可能會好得多,因此你的原始切入點將起作用(如果toString()永遠不會被調用,否則你不會丟失任何東西)。

如果您決定采用這種方法,那么aspectj文檔的一部分將幫助您開始加載時編織。

更新:另一個選項是使用Eclipse的Detail Formatters 它們允許您裝飾toString()方法以進行調試。


原始答案:您可以嘗試使用cflow來匹配toString()控制流中的任何連接點。 注意我無法驗證這一點,因此請檢查語法(它可能還需要執行()而不是call(),盡管我無法回想起來。 例如:

public pointcut myToString() : cflow(call(String mypackage.*.toString()));

另外一點,小心添加System.out調用,考慮使用日志框架。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM