2012-11-07 82 views
2

在描述我的問題之前,讓我說我懷疑我可能完全缺乏搜索的正確術語,這就是爲什麼我在stackoverflor上的搜索沒有成果。因此,對答案的鏈接也將非常感激。工廠類自動加載Java中特定超類的子類?

我試圖做一個庫,有一個工廠,讓我們稱之爲「MyFactory」。 MyFactory有一個方法可以返回抽象類「MySuper」的對象,也可以將可拓子類暴露給「MySuper」。該庫的目的是擴展很多,所以經常會添加「MySuper」的子類,然後庫將被重新編譯,並轉儲到使用它的應用程序的庫文件夾中。

我想要的是能夠將「MySuper」的子類添加到庫中,並讓「MyFactory」知道它,而不需要做任何事情而不是創建一個新的「MySuper」子類。 。

到目前爲止,我使用反射來使「MyFactory」創造「MySuper」類型的新實例,通過給類名的方法,像這樣:

public MySuper getSuperObject(String name) { 
    return (MySuper) Class.forName("my.package." + name).newInstance(); } 

但我怎麼能得到工廠將「MySuper」課程公開爲fx一個字符串列表,所以使用該庫的應用程序知道他們可以調用什麼?我可以迭代包的內容嗎?

我打開的解決方案中,最重要的是,在未來它應該是自由添加新的「MySuper」子類很麻煩..

感謝:-)

UPDATE :

我只想說明我已經找到一個很好的Java庫,它以簡單的方式處理反射,並且允許您搜索特定類的子類型。所以我的問題可以通過該庫解決(我已經測試過)。這裏是一個鏈接:http://code.google.com/p/reflections/

回答

1

你正在尋找一個Generic Factory Pattern發表評論。喜歡的東西..

public static <T extends MySuper> T createDocument(Class<T> subClazz) throws InstantiationException, IllegalAccessException { 
     return subClazz.newInstance(); 
    }; 

您可以谷歌Generic Factory Pattern,你會發現很多的例子。

+0

看起來非常好。但是,我該如何讓庫知道子類,以便我可以向使用該庫的應用程序暴露諸如「ArrayList mySubClasses」之類的東西?我的谷歌搜索主要揭示了實際實現子類的方法(就像你給我展示的那樣)。我懷疑我需要一種方法來調查項目中的軟件包,看它是否包含擴展MySuper的類。 – Stegger

+1

林不知道我是否理解正確,但你正在尋找'找到給定的類/接口的所有子類?'。如果是這樣的話,我早已寫了一篇博客。您可能會發現這對返回給定類的'List '有幫助。希望那麼你可以使用反射爲這些類創建實例。這裏是鏈接http://nonstop-rp.blogspot.in/2010/05/java-reflection-know-subclasses-of.html ..正如我所說這是一個古老的博客.. –

+0

這看起來很有前途,是正是我正在尋找的東西。我會接受你的答案 - 並在你的博客中窺探。 – Stegger

0

我建議創建一個包含可能的子類MySuper的枚舉。每當你添加一個子類時,在枚舉中添加一個條目,然後你可以把它作爲getMySuperObject()方法的輸入。

做如果u想我已經在這個解決方案留下的東西

+0

嗯,我確實看到這是一個有效的解決方案,因爲它不需要太多的系統知識。事情是,許多開發者可能需要將「MySuper」子類添加到庫中,他們需要了解的系統越少越好。所以我希望有一個解決方案,他們只需要添加子類,然後庫自動處理剩下的部分。 – Stegger

+0

如果你想暴露一個api,它會選擇特定包中的任何類或擴展另一個類,那麼這很難,但是你可以提供一個啓動時讀取的配置文件,並且這個文件包含一個類列表條目你已經創建。這就是我們迄今爲止在我們的應用程序中所做的。 – MozenRath

1

默認的類加載器在類搜索之前一無所知。然後它根據班級路徑在幾個地方查找。如果你依賴於類加載器,你將無法將該類加入到列表中,直到已經按名稱提出要求。

最自動的解決方案可能是爲擴展MySuper的新類指定一個位置,例如目錄。要構建類的列表,請在該目錄中查找類文件,然後使用您最喜歡的字節碼庫來檢查擴展MySuper的類。

另一個選項是有一個配置文件,列出擴展的類名。