2013-10-07 57 views
5

我只有大約半年的Java經驗,所以請原諒我缺乏知識。我試着做一些谷歌搜索,我對此有一些想法,只有幾個漏洞需要填寫。Java動態工廠

我正在嘗試爲我正在執行的程序創建一個「動態工廠」。這樣做的基礎是我希望人們能夠將類文件插入到文件夾中,然後將它們加載到我的工廠中,以便稍後創建它們的新實例。

這就是我現在所擁有的:

import java.util.HashMap; 
import java.util.Map; 

public class KitManager { 

    private Map<String, Class<? extends Kit>> kitMap; 

    public KitManager() { 
     kitMap = new HashMap<String, Class<? extends Kit>>(); 
    } 

    public Kit makeKit(String kitname) { 
     try { 
      return kitMap.get(kitname).newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

現在什麼,我試圖找出是如何讓所有的類文件夾內,確保它們延伸套件,然後將其插入放入地圖中以便稍後創建它們的實例。這是我卡住的地方,我想不出有什麼好的方法讓類加載到地圖中,而不需要在配置文件中找到類名和查找字符串。我的想法是在每個類中都有靜態代碼,將自己插入到HashMap中,但我不確定這是如何工作的。我真正要求的是一個關於如何去完成我的目標的想法。 (有一個用戶可以輸入類的文件夾(擴展Kit),然後當我的程序被加載時,這些類會動態加載到我的kitMap中)

回答

2

當需求有點模糊時,很難給出一個好的答案。

從你說的話,你可以只創建一個指向,用戶把自己的類目錄中的類加載器:

ClassLoader kitClassLoader = new URLClassLoader("file://<path>", KitManager.class.getClassLoader()); 

要真正找到類,使用簡單的目錄列表的方法,例如java.io.File.listFiles()(使用指向正確的路徑顯然是一個文件實例):

File[] candidates = new File("<path>").listFiles(); 

然後,您可以使用kitClassLoader實際加載發現了一類:

kitClassLoader.loadClass(className); 

類名稱可以通過簡單地將listFiles()中找到的文件中的「.class」擴展名分解而得到。在加載完類之後,你可以檢查它是否有一個默認的構造函數,並且如果它確實實現了Kit(如果沒有,拒絕它或者顯示錯誤信息)。

這就是基本的方法,但是它有嚴重的安全問題(你不知道什麼類實際上將當你加載它們),也可能引入具有相關性的問題(您加載可能需要額外的類庫?)。

+0

類加載器的目的究竟是什麼?編輯:所以顯然評論不喜歡裏面的代碼。難道我不能像file.getClass()。asSubclass(Kit.class)那樣做,並將其添加到hashmap中(假設一切安裝正確,文件擴展工具包等等) – Phiction

+0

@ user2792581 * *只有通過ClassLoader才能獲得虛擬機的類。問題是File.getClass()根本不存在。 ClassLoader是從虛擬機中的類文件到實際類的橋樑。 – Durandal

+0

我假設kitClassLoader.classForName(className);是指kitClassLoader.loadClass()? – Phiction