簡體   English   中英

使用反射進行JAVA重構

[英]JAVA refactoring using reflection

我在少數Java應用程序中使用了第三方API。 他們已經在最新版本中更新了一些內容。 我們將必須更新到最新版本,並且需要對代碼進行相應的更改。 的變化是,

1)我們用於實現/擴展的接口和抽象類名稱已更改。 此外,方法名稱已更改。 這些都只是名稱更改。

2)需要用@Service注釋實現這些接口的類

3)然后需要添加一些新的Java文件和屬性文件。

4)我們也有實現第三部分抽象類的抽象類,然后有很多具體的類。 因此,在擴展基本抽象類的基礎抽象類中,很少有第三方抽象類的方法被覆蓋,而具體的抽象類中幾乎沒有方法。

我可以通過Eclipse IDE進行重構,但是我們不喜歡這樣做。 我喜歡這完全自動化,就像運行腳本一樣。

我嘗試使用Java反射來查找Abstract類的所有具體類並重命名方法。 盡管如此,它看起來還是有風險的。

還有其他更好的方法嗎?

這取決於您需要更改多少代碼,完成每個步驟需要多長時間以及重復相同的重構多少次。 如果只有幾百個類和/或更簡單的重構(如重命名類/接口)可以完成大部分工作,則可以手動完成。

否則,如果您確實願意,可以嘗試在類似AutoRefactor的工具中編寫規則: https : //github.com/JnRouvignac/AutoRefactor

免責聲明:我是AutoRefactor的作者。

我記得在某個地方讀過一個程序員,他寧願花12個小時編寫腳本來自動執行手動任務,也不願花20分鍾實際完成該任務。

我了解您為什么要自動執行此操作-您正在使用的API通過重命名來使客戶的生活變得艱難。 API僅通過命名來破壞兼容性是不尋常的-您確定它是如此簡單嗎?

我的強烈建議是硬着頭皮手動進行重構。 幾乎可以肯定,與自動化過程相比,這將花費更少的時間,您將發現進一步的機會來改進自己的應用程序的設計,並且不太可能需要再次使用重構腳本。

不幸的是,我現在不了解您的具體情況。 我可以根據我的經驗指出一些可以簡化未來生活的原則。

很快,如果您使用任何第三方API,請嘗試將其傳播到您的代碼中的可能性降至最低。 使用Adapter,Facade等模式將第三方代碼隱藏在自己的抽象(接口)后面。

因此,萬一第三方代碼發生更改,您將只能在一個地方進行更改。 這種方法為您提供了更大的自由度:如果您決定使用另一個第三方API,它將很簡單,因為不會影響代碼的主要安全性。 在測試時它也很有用:您可以模擬實際的第三方功能。

例如,假設您的項目需要永久存儲。 因此,您可以從這樣聲明接口開始:

interface IStorage {
    void save(Model m);
    Model load(int id);
}

這將使您:

  • 稍后再決定存儲提供者(可能是MySQL或MongoDB,或者只是磁盤上的XML文件)。
  • 輕松地用一個第三方API替代另一個(例如,從文件存儲更改為數據庫)。
  • 通過模擬此接口而不是使用實際存儲,可以輕松測試業務邏輯。
  • 如果某些模塊(其他開發人員必須做)需要有效的存儲(它們將僅使用IStorage接口,就好像已經實現了),則可以加快開發速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM