2011-10-28 89 views
10

夥計們,這裏是我的問題:我有一些課程在我的項目的許多地方使用。我必須用提供的jar替換這個類。有什麼方法可以重構這個嗎?我想這是一個簡單的問題,但我不知道如何解決它。有沒有辦法在Intellij Idea中用另一個替換Class?

它不是關於替換源代碼 - 我想要的是從我的庫中替換所有類的用法,並能夠完全刪除我自己的類。想象一下,我創建了自己的StringUtils,並發現有一個apache.common的StringUtils庫,現在我想在我的代碼中的任何地方使用它。類方法的簽名不是問題:它們是一致的。

+3

導入語句的全局替換將執行此操作。 – duffymo

+1

只有當班級名稱相同時,全局替換纔有效。所以我想它可能會回答這個特定的情況,但不會回答「這個問題」...... – Trejkaz

回答

0

雖然我不是IntelliJ的專家,但我可以告訴你,通常在java中,類加載是按順序完成的。我的意思是類加載器正在按順序尋找類,所以如果同一個類在類路徑中多次出現,它將採用第一個版本。

所以,這取決於你如何運行你的應用程序。例如,如果您正在使用類似java -cp lib.jar;myapp.jar com.mycompany.Main的命令行,並且lib.jar和myapp.jar都包含相同的類Util,則將使用lib.jar版本。

如果您想從IDE運行時獲得相同效果,請嘗試檢查項目屬性。可能你可以控制圖書館罐子相對於你項目的課程的順序嗎?如果不是,可能可以將jar添加到引導類路徑中。在這種情況下,將lib.jar添加到引導類路徑(僅用於處理IDE)。

祝你好運。

1

最簡單的方法是編寫一個映射你想要內聯的方法。

假設你有一個方法

enum MyStringUtils { 
    public static boolean containsAnyCase(String searchFor, String searchIn) { 
     // something 
    } 
} 

// calling code 
boolean found = MyStringUtils.containsAnyCase(find, in); 

你想用StringUtils.containsIgnoreCase然而,類名,方法名和參數的順序是不同的。

因此,您改變方法的主體來調用所需的方法。

public static boolean containsAnyCase(String searchFor, String searchIn) { 
     return StringUtils.containsIgnoreCase(searchIn, searchFor); 
    } 

選擇方法和<鍵Crtl> + < ALT> + N。這將提供無處不內聯這個方法並刪除你的方法。您的來電者現在看起來

boolean found = StringUtils.containsIgnoreCase(in, find); 

如果原來的類使用類的一個importimport static方法或沒有導入所有的這甚至會工作。

3

如果您正在使用靜態方法(如您的StringUtils的例子表明),委託給新的類在以前實現像

public static String myOldMethod(String argument) { 
    return MyNewClass.myNewMethod(argument); 
} 

然後選擇Refactor->內嵌並選擇「所有的調用和刪除方法「在選項對話框中。通過這種方式,您可以處理方法名稱更改並且參數順序更改很順利。

18

有這個「遷移」函數。右鍵單擊任何類 - >重構 - >遷移。

有點煩人,你必須創建一個新的遷移集,你不能從頭開始運行它。但它完全符合你的需求。

挑選要遷移的類或包並告訴它它應該更改到哪個類或包。按下運行,所有用法都被重寫。然後你可以自由地刪除舊的類,因爲沒有用法。

乾杯!

+1

整潔的工具,但它是一個IntelliJ幫手的令人驚訝的手動勞動。 –

+0

我一直認爲這些「遷移」是固定的,永遠不會想到它們可以像這樣定製......不是這裏最好的UX設計, - ) – Gregor

相關問題