2010-07-29 81 views
0

我想跟蹤Foo類中所有方法的調用。這將覆蓋從Foo這樣所有的方法另一類...如何跟蹤一個類的所有方法調用?

@Override 
public void blah() { 
    System.out.println("blah()"); 
    super.blah(); 
} 

...會做 - 但我真的需要重寫所有這些(超過100方法)?

這可以用一些更聰明的方式完成,例如使用反射?

編輯:澄清 - Foo是一個本地庫的JNI接口,我需要這個將所有調用保存到一個文件中,以生成C代碼,這些代碼完全符合我從Java所做的。

+2

我不明白你爲什麼不使用探查器?他們發起方法調用。或者「跟蹤」是什麼意思? – InsertNickHere 2010-07-29 10:44:08

回答

1

首先,如果您在一個類中有100個方法,那麼它是重構的主要候選者。然後 - 您可以在對象周圍創建代理(使用CGLIB或javassist),並且每當調用方法時,都會報告調用。

+0

這是一個有很多本地方法的類。我無法更改其API。 – mik01aj 2010-07-29 11:08:47

1

出於調試,如果您正在使用IBM JVM,您可以使用方法跟蹤(可禁用某些追蹤方法的JIT優化):

以文本形式打印輸出流:

-Xtrace:iprint=mt,methods{com/my/package/ClassName.methodName} 

或二進制格式文件(流程與內置com.ibm.jvm.format.TraceFormat應用程序):

-Xtrace:maximal=mt,methods{com/my/package/ClassName.methodName},output=trace.dat 

全部細節的Java診斷指南: http://www.ibm.com/developerworks/java/jdk/diagnosis/

1

如果你只需要這個用於調試/開發目的,而不是在最終系統中,你可以使用Eclipse分析。 Eclipse概要分析允許您定義在不同時間執行的探針(例如,在方法的開始處),這些探針允許您在訪問諸如方法名稱和參數值等內容的同時執行任意Java代碼。您可以定義各種過濾器,以便僅在當前需要的位置執行探測。我不知道它究竟是如何工作的,但我認爲這些類文件是經過檢測的,所以運行時影響應該相對較低。

另一方面,如果你需要這樣的產品代碼,我會投票給AOP--就像nanda提出的一樣。

相關問題