java - 从文件夹加载类而不指定包

标签 java classloader urlclassloader dynamic-class-loaders

我有一个应用程序,允许人们使用抽象类编写自己的实现。我从目录中将这些实现作为 .class 文件加载。目前,我有这个解决方案:

File classDir = new File("/users/myproject/classes/");

URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);

String filename;
for (File file : classDir.listFiles()) {
    filename = string.getFilenameWithoutExtension(file);
    if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
        continue;

AbstractClass instance = (AbstractClass)urlLoader
    .loadClass("org.mypackage." + filename)
    .getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
    .newInstance(config, database, string));

    instance.doSomething();
}

如您所见 - 我需要指定类所在的包,以便正确加载它们。省略包,我得到一个

 java.lang.NoClassDefFoundError:
     MyClass (wrong name: org/mypackage/MyClass)

错误。

现在,从架构的角度来看,我认为其他人设计的类在加载它们时必须编译到我的包中是非常糟糕的设计。

所以我问你:有没有一种方法可以从文件系统加载类,而不必指定它们所在的包?

最佳答案

是的;实现接口(interface)(或使用注释)。

然后使用任何类扫描库(有很多关于此的 SO 问题,例如 this one )来加载有问题的特定类。搜索“Java 类扫描”或“Java 插件机制”会有帮助。

您可能还只想使用 Java Plugin Framework 并避免一些工作。虽然我不清楚它是否已得到维护,但我知道人们仍在使用它。

关于java - 从文件夹加载类而不指定包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195540/

相关文章:

java - 编辑文本等于

Java HTTPS 服务器 : Mutual SSL Authentication

android - 开始新 Activity 时打开进度对话框

java - 自定义 URLClassLoader,运行时出现 NoClassDefFoundError

java - Groovy 扩展模块方法 - 无方法签名

java - hibernate sqlquery 到 DB 而不进行映射

java - eclipse无法启动我的tomcat服务器,如何开启服务器

java - Glassfish 3.1.1 类加载器与 jar 文件的顺序

java - 使用 setExtractWar(false) 在嵌入式 Jetty 中加载 war 会抛出 IllegalArgumentException

运行外部代码/应用程序的 Android 应用程序?