【发布时间】:2012-02-08 14:46:24
【问题描述】:
我有一个应用程序,它允许人们使用抽象类编写自己的实现。我将这些实现作为 .class-files 从目录加载。目前,我有这个解决方案:
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)
错误。
现在,从架构 POV 来看,我认为其他人设计的类在加载时必须编译到 MY 包中,这是非常糟糕的设计。
所以我问你:有没有一种方法可以从文件系统中加载类,而不必指定它们所在的包?
【问题讨论】:
-
您可以将包结构保留为路径下的文件夹结构吗?并在加载类之前从路径中创建包名?
-
这是可能的……至少这样我就不必在两个班级同名时为自己烦恼了……从另一个角度思考很好! :)
-
试试看它是否有效,如果你想要一些代码示例,请告诉我!
标签: java classloader urlclassloader dynamic-class-loaders