2017-02-17 39 views
0

可能有一些相關的問題,但我認爲我的情況足夠奇怪,足以證明自己的問題。在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

感謝您的幫助。

回答

0

一些替代方案:

  1. 你可以遷移到更現代的Java這種模式,它是方法引用的主要候選人。然後,當您重構/重命名時,您選擇的IDE可以自動處理該問題。隨着機會/必要性的增加,這可以一點一點完成。
  2. 你可以寫自己的自定義註釋:
    • ,你可以可能得到SonarQube掃描
    • 這可以讓您利用javax.validation的*好吃的東西,所以你的代碼可能外觀/感受更像'標準'的Java EE代碼。
    • 在構建步驟中,處理器可以覆蓋註釋,各種構建工具都有方法將其掛鉤 - 而處理器可以執行更高級/代價高的內省,因此您可以將驗證推送到編譯時,而不是運行-時間。
+0

我覺得方法的引用來自Java 8?由於複雜的原因,這個項目仍然受到Java 6的約束,需要500個字符來解釋。由於龐大的代碼庫,添加註釋還需要數百個小時。因此,我在問如何爲這種特定情況編寫驗證器或自定義規則,而不必更改代碼。當項目在10年內遷移到Java 8時,我們可以重新考慮使用方法參考。 – outofmind