可能有一些相關的問題,但我認爲我的情況足夠奇怪,足以證明自己的問題。在SonarQube中靜態使用反射與自定義規則的自定義驗證器(Java,Eclipse)
我正在研究一個歷史性增長的巨大Java項目(遠遠超過一百萬個LOC,由於其他原因,我們現在仍然必須使用Java 6),其中反射用於在表中顯示數據 - 反射不用於動態更改顯示的數據,但僅用於在代碼中使用某種快捷方式。代碼的簡化部分如下所示。
TableColumns taco = new TableColumns(Bean.class);
taco.add(new TableColumn("myFirstMember"));
taco.add(new TableColumn("mySecondMember"));
...
List<Bean> dataList = getDataFromDB(myFilterSettings);
taco.displayTable(dataList);
因此,每行的表格單元格的值存儲在Bean
的實例中。第一個單元格的值來自調用itemOfDataList.getMyFirstMember()
(所以這裏是代碼的反射部分)。表單元格的渲染取決於itemOfDataList.getMyFirstMember()
的返回類型。
這樣,很容易在表中添加新列,以標準方式渲染它們而不必關心任何細節。
此方法的問題:當getter名稱更改時,編譯器不會注意到,並且在運行時會出現異常,以防Bean.getMyFirstMember()
重命名爲Bean.getMyFirstMemberChanged()
。
雖然使用反射來確定調用哪個getter,但所需的信息實際上在編譯時可用,但沒有用於列信息的變量。
我的目標:有一個驗證程序,它將在編譯時檢查Bean
類中是否存在所需的getter方法。
可能solultions:
修改代碼(使用更具體的相關信息,書寫的適配器,使用註釋或任何可在編譯時由編譯器檢查)明確地,我由於龐大的代碼基礎,不想要這種解決方案。我只需要保證反射在運行時不會失敗。
寫自定義的驗證:我想這不應該是太複雜了,但我沒有真正知道如何開始,我們使用Eclipse IDE,所以應該可以寫一個這樣的自定義驗證 - 任何提示一個好的起點? 如果
TableColumn(parameter)
中的parameter
不是final
(應該是文字或常量),驗證器應該在eclipse中顯示警告。如果將TableColumn
添加到TableColumns
並且相應的Bean.getParameter()
不存在,驗證器應該在eclipse中顯示錯誤。爲我們所用SonarQube質量檢查,我們也可以實現一個自定義規則檢查,如果確實存在的方法 - 不能完全肯定這一自定義規則是可能的(可能是)
- 也許其他的解決方案,這將使Eclipse中的快速反饋,有些表將不能正確地呈現一些getter方法分別更名爲
後,我問什麼:
在這種情況下會更容易:爲eclipse編寫自定義驗證器或爲SonarQube編寫自定義規則?
線索從哪裏開始這兩種方法
提示其他solultions
感謝您的幫助。
我覺得方法的引用來自Java 8?由於複雜的原因,這個項目仍然受到Java 6的約束,需要500個字符來解釋。由於龐大的代碼庫,添加註釋還需要數百個小時。因此,我在問如何爲這種特定情況編寫驗證器或自定義規則,而不必更改代碼。當項目在10年內遷移到Java 8時,我們可以重新考慮使用方法參考。 – outofmind