我只有大约半年的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;
}
}
}
现在我要弄清楚的是如何获取文件夹中的所有类,确保它们扩展Kit,然后将它们插入到Map中以便稍后创建它们的实例。这就是我被卡住的地方,我想不出一个好的方法将类加载到地图中而不需要在配置中的某个地方标识类名和查找字符串。我的想法是在每个类中都有静态代码将自己插入到HashMap中,但我不确定这是如何工作的。我真正要求的是关于如何实现我的目标的想法。 (有一个用户可以输入类的文件夹(扩展Kit),然后在我的程序加载时将这些类动态加载到我的kitMap中)
答案 0 :(得分:2)
当要求有点模糊时,很难给出一个好的答案。
根据你的说法,你可以创建一个指向用户放置类的目录的ClassLoader:
ClassLoader kitClassLoader = new URLClassLoader("file://<path>", KitManager.class.getClassLoader());
要实际查找类,请使用简单的目录列表方法,例如: java.io.File.listFiles()(使用指向正确路径的File实例):
File[] candidates = new File("<path>").listFiles();
然后,您可以使用kitClassLoader实际加载找到的类:
kitClassLoader.loadClass(className);
您可以通过简单地从listFiles()找到的文件中拆分“.class”扩展名来派生类名。加载类之后,您可以检查它是否确实具有默认构造函数,以及它是否真正实现了Kit(如果它没有,则拒绝它或显示错误消息)。
这基本上就是这种方法,但它有可怕的安全问题(你不知道这些类在加载时实际上会做什么),并且它也可能会引入依赖关系的问题(类你加载可能需要额外的库?)。