Java动态工厂

Java动态工厂,java,reflection,Java,Reflection,我只有大约半年的java经验,所以请原谅我缺乏知识。我试着做了一些谷歌搜索,对此我有一些想法,我只需要填补一些漏洞 我正在尝试为我正在做的程序创建一个“动态工厂”。其基础是,我希望人们能够将类文件插入到文件夹中,然后将它们加载到我的工厂中,以便稍后创建它们的新实例 这就是我现在拥有的: import java.util.HashMap; import java.util.Map; public class KitManager { private Map<String, Cla

我只有大约半年的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;
        }
    }   
}
import java.util.HashMap;
导入java.util.Map;
公共类KitManager{

私有地图当要求有点模糊时,很难给出一个好的答案

根据您所说的,您可以创建一个类加载器,指向用户放置其类的目录:

ClassLoader kitClassLoader = new URLClassLoader("file://<path>", KitManager.class.getClassLoader());
只需从listFiles()找到的文件中拆分“.Class”扩展名即可派生类名。加载该类后,您可以检查它是否确实具有默认构造函数,以及它是否真正实现了Kit(如果没有,则拒绝它或显示错误消息)


这基本上是一种方法,但它存在严重的安全问题(您不知道加载类时类实际上会做什么),并且可能会引入依赖性问题(加载的类可能需要额外的库?).

类加载器的具体用途是什么?编辑:显然注释不喜欢其中的代码。我难道不能做一些类似file.getClass().asSubclass(Kit.class)的事情,并将其添加到hashmap中(假设所有设置都正确,文件扩展了Kit等)@user2792581将类放入VM的唯一方法是通过类加载器。问题是文件.getClass()根本不存在。类加载器是从类文件到VM中实际类的桥梁。我假设kitClassLoader.classForName(className);指的是kitClassLoader.loadClass()?@user2792581是的,我的错。“classForName()”用于访问类路径上已存在的类(驱动程序等更常见的情况)。您可能希望在kitClassLoader上使用loadClass()。
File[] candidates = new File("<path>").listFiles();
kitClassLoader.loadClass(className);