2011-10-14 24 views
3

我們需要編寫一個checkstyle自定義檢查,用於驗證特定條件,以便從某個特定的類A直接或間接繼承的類。是否可以使用checkstyle API識別間接繼承? 例如,假設我們有:如何編寫涉及間接繼承的Checkstyle自定義檢查?

  • C類--- ---延伸> B類
  • B類--- ---延伸>類甲

在這種情況下通過查找「擴展」標記(TokenTypes.EXTENDS_CLAUSE)並在擴展子句AST中查找B,很容易檢查C是B的子類。但是我們怎麼能知道C也是A的一個子類呢?

Java反射加instanceof是唯一的出路嗎? (在我們的案例中爲Not desirable,因爲我們必須運行數千個文件的檢查。)

PMD或其他靜態分析工具是否允許我使用該(間接繼承)條件編寫自定義檢查?

回答

2

它可以完成,但不容易,因爲checkstyle沒有Java編譯器。所以它只能查看源文本並分析它的語法樹,但它不能「理解」它。

因此,您必須在您的checkstyle檢查中從加載這個班級。爲此,您很可能需要定義您自己的類加載器,以便您可以加載來自Eclipse的工作空間(或來自其他源的其他類)的類。

現在你可以簡單地打電話給instanceof A和voilà!

我不擔心表現。您可以將類文件的LRU緩存添加到您的自定義類加載器,這可以解決此問題。另外,如果檢查在你的IDE中運行,它只需要加載很少的類(直接繼承樹中的類),並且如果它在整個源代碼上運行,它將在晚上運行,不是嗎?

由於這個問題已經很老了,讓我知道你是否需要一個代碼示例。

0

我們已經解決了與Java反射的問題:

Class<?> clazz = Class.forName(ClassA); 
if (ClassC.class.isAssignableFrom(clazz)) { 
    // Class C is a direct or indirect subclass of ClassA 
} 

這雖然限制了海關檢查的適用性,因爲它只有在ClassA和ClassC在類路徑中工作。