Java动态工厂

标签 java reflection

我只有大约半年的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 以便稍后创建它们的实例。这就是我卡住的地方,我想不出一个好的方法来将类加载到 map 中,而无需在配置中的某处标识类名和查找字符串。我的想法是在每个类中包含静态代码,这些代码会将自身插入到 HashMap 中,但我不确定它是如何工作的。我真正想要的只是关于如何实现我的目标的想法。 (有一个文件夹,用户可以在其中输入类(扩展 Kit),然后在我的程序加载时让这些类动态加载到我的 kitMap 中)

最佳答案

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

根据您的说法,您可以创建一个指向用户放置类的目录的 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(如果没有,则拒绝它或显示错误消息)。

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

关于Java动态工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19230006/

相关文章:

php - ReflectionFunction 的 isDeprecated 是如何工作的?

c# - ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共(public)构造函数吗?

java - 从 java 应用程序发送邮件而不使用外部 SMTP 服务器

java - eclipse 中的 R.menu 错误

java - 压缩和解压缩文本从 html 到服务器,反之亦然

unit-testing - 查询组装

java - 如何从java反射中的方法获取 "genericInfo"

java - 线程 “main” java.lang.UnsupportedClassVersionError :HelloWorldApp 中的异常

java - 什么是静态和非静态?何时使用以及如何使用它们?

r - 如何获取在 R 中重新创建数据框的代码?