2011-09-05 35 views
6

我們擁有龐大的代碼庫,並且一些類通常通過遍及代碼的反射來使用。我們可以安全地刪除類和編譯器是幸福的,但其中一些使用動態反射,所以我不能以其他方式找到他們不是搜索字符串使用...Java:查找反射代碼的使用情況

是否有Java代碼的一些反思探險家嗎?

+0

如何動態地使用類,他們用他們的全名作爲一個字符串或腳本這是正在使用的裝在運行時評估? –

+0

全稱爲字符串 – Xorty

+0

如果可能,請避免這樣做。類似安全的Java語言如此強大並且在企業系統中使用的原因是,編譯時類型檢查可以在編譯時找到大多數類型衝突 - 除非您使用反射來完成某些事情 - 那麼所有投注都將關閉,您將返回在你的代碼嵌入了'地雷'的黑暗時代,當你的一個用戶恰好碰巧用你沒有想過測試的方式來運行一段代碼時,這些代碼可以隨時關閉。 – Volksman

回答

3

我建議,使用適當授權的源代碼爲您的JRE,修改反射類以便在反射使用類時使用(使用地圖/ WeakHashMap來忽略重複項)。您的修改過的系統類可以在命令行上(在Oracle「Sun」JRE上,其他人可能具有類似的東西)替換rt.jar中的-Xbootclasspath/p:。運行你的程序並測試,看看會發生什麼。

(也許你可能要砍周圍的類加載順序問題,在系統類。)

+0

但是,這隻會找到該程序的特定運行中加載的內容。我所建議的是靜態地做同樣的事情,並且不需要經歷修改類的痛苦。對你的評論感興趣。謝謝。 –

+1

@Hemal類型取決於正在使用的反射。反射的更多有用的用途不會使字符串硬編碼。如果字符串是硬編碼的,那麼我會建議''java.lang.reflect'的grep和去除反射。 –

4

沒有簡單的工具來做到這一點。但是,您可以使用代碼覆蓋。它所做的是給你一個所有執行代碼的報告。這對於改進測試代碼或刪除死代碼更加有用。

思考是非常清晰的動態,你必須運行正確的代碼,看看它會怎麼做。即您必須進行合理的測試。您可以添加記錄的一切思考呢,如果你可以訪問此代碼,或者你可以使用這些庫的儀器(或直接改變它們)

0

我懷疑這樣的工具是現成的,但我可能是錯的。

這是相當複雜的,考慮(通過反射)動態加載的類本身可以動態地加載其他類和加載的類的名稱可以來自變量或某些運行時輸入。

你的代碼可能確實沒有這些。如果這一次搜索字符串可能是一個不錯的選擇。或者您尋找對反射方法的調用。

0

由於其他海報提及,這不能用靜態分析做由於反射的動態特性。如果您使用的是Eclipse,您可能會發現這個覆蓋率工具很有用,並且使用起來非常簡單。它被稱爲EclEmma