2012-01-22 55 views
2

我使用的是有一個公共靜態方法庫getFile()Utils類中定義。圖書館在內部使用Utils.getFile(),但這種方法並沒有很好地實施。是否有可能取代Java中的公共靜態方法?

我想知道是否有可能以某種方式覆蓋Utils.getFile()所以它會用我的實現呢?

+0

如果你的實現,爲什麼你不能在util中編寫你自己的方法。 –

回答

4

否 - 不與幾乎複製類和替換它。否則,對於Christian的評論,更好的選擇可能是+1:Why doesn't Java allow overriding of static methods?

如果它是非靜態的並且該方法不是私有的或最終的,則可以爲該類繼承子類,提供您自己的重寫方法並使用它。

+0

'''''''''''''''''''''''''我假設你的意思是複製庫或者至少是內部調用'Utils.getFile()'的類,對吧?複製'Utils'沒有多大幫助。 – Thomas

+0

@Thomas - 正確。 (我假定所有對'.getFile()'的調用都只能通過'Utils'中的其他方法調用,如果不是這樣,這些選項 - 包括一個包裝類 - 都不會起作用 – ziesemer

1

不,你不能覆蓋它。靜態方法有這些類型的問題,例如,編寫單元測試時。

0

通過獲取庫的源代碼修復代碼並重新創建jar文件。嘗試使用JAD(以及FrontEndPlus)將.class文件反編譯爲.java文件。

如果呼叫在您的代碼,那麼你可以使用你的完全合格的utils的類名前綴的方法。例如:{命名空間} .Utils.getFile()..

+1

JAD似乎是相當老,AFAIK最完整的免費反編譯器是[JD](http://java.decompiler.free.fr/) - 你也反編譯爲_.java_文件,而不是_.jar_文件:) – Thomas

+0

啊,謝謝:-) ..我現在是一名.NET開發人員,所以自2005年以來我沒有使用過Java – MacGyver

1

您唯一的選擇是替換類。您可以編譯一個不同的版本,並在類路徑中更早地創建它,或者替換原始副本。

Java不支持靜態方法的多態性(您可以隱藏但不能覆蓋靜態方法)因此,實用程序類通常會使final清楚。爲了實現這個,我使用了沒有實例的enum

public enum Util {; 
    public static ReturnType method(ParameterTypes... args) { 
    } 
} 
相關問題