2015-02-23 50 views
1

我在一個巨大的產品中有一堆我不想使用的類,而是我想將它們的用途重定向到不同的類。這些類(和接口)大多是日誌記錄類。例如,org.apache.log4j類(很久以前)採用不同的包名稱導入到源中,如foo.org.apache.log4jJava代碼反射和爲類重定向生成外立面

現在,我想使用一些使用這些導入和重命名的類但沒有這些導入和重命名的類的組件。這是因爲導入的數據源是舊的並且缺少功能,所以我不能按原樣使用它。此外,有兩種不同的log4j的實現中,老一個進口原裝的log4j,創建配置過程中的問題,等等。

我的作戰計劃,到目前爲止,是爲了排除不需要的依賴關係pom.xml並以某種方式自動生成幕牆這將取代不需要的類,並將重定向到原始庫。例如,foo.org.apache.log4j.Logger將被替換爲從org.apache.log4j.Logger繼承的外觀。

現在,是否有任何類型的庫或工具可以輕鬆遍歷由foo.org.apache.log4j定義的所有現有類,並允許我生成這些外觀,還是必須使用反射自行實現所有內容?

+1

行,爲什麼近距離投票?這個問題有什麼問題? – wilx 2015-02-23 11:34:28

+1

我不是那個投了近距離投票的人,但這可能是因爲你開始談論反思之後,如何提出你的問題來問一個「圖書館或工具」。 – Vulcan 2015-02-23 11:36:15

回答

5

我不會使用工具來生成這些類,因爲它是一次性的。

相反,我會使用IDE來生成實現並使用重新分解,例如用代理替換繼承。這將生成您需要的外牆,而無需額外的工具。

例如假設你需要一個Map的包裝(此工作的IntelliJ但其他也可以做​​到這一點)

class MyMap<K,V> extends Map<K,V> { // this doesn't compile but can be refactored 

如果我不「替換代表團繼承」我得到它做了包裝編譯

class MyMap<K,V> { 
    private Map<K,V> map; 

    public V get(K key) { return map.get(key); } 

    // all the methods of map have been wrapped 
} 

現在說我想從不同的封裝圖,但與SMAE簽名,我可以改變進口,它會使用不同的地圖包

class MyMap<K,V> implements somepackage.Map<K,V> { 
    private some.other.pkg.Map<K,V> map; 
    // all the delegation methods I need. 
    // customise them as required. 
} 

注:內聯後,不會有甚至是signific螞蟻性能損失。

+0

對於20類以下的任何東西來取代(如果我們正在討論像log4j這樣的庫,就是這種情況),這似乎是最簡單的解決方案。 – biziclop 2015-02-23 11:39:13