我正在开发一个命令行应用程序,该应用程序在运行时加载用户指定的文本翻译器(通过命令行 arg 提供的类文件/jar 的路径)。基本上我正在使用该参数并使用它来创建 URLClassLoader。然后我需要找到实现 Transable 接口的 URLClassloader 可用的所有类。
现在我只允许这个命令行 arg 是一个包含类文件的目录。使解决方案相当简单(下面的代码)。但老实说,我不喜欢该解决方案,因为它会分解 jar 文件、jar 文件目录等......此外,这显然会分解任何具有已定义包的类,因为 loadClass 需要包含包的全名。谁有更好的方法?
File d = new File(path);
if(d.isDirectory()) {
URL url = d.toURI().toURL();
ClassLoader cl = new URLClassLoader(new URL[]{url});
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".class");
}
};
for(File f : d.listFiles(filter)) {
String name = f.getName().substring(0, f.getName().indexOf("."));
String key = "";
if(name.endsWith("Translator")) {
key = name.substring(0, name.indexOf("Translator"));
}
else if(name.endsWith("translator")) {
key = name.substring(0, name.indexOf("translator"));
}
else
key = name;
Class c = cl.loadClass(name);
if(Transable.class.isAssignableFrom(c)) {
Transable t = (Transable)c.newInstance();
env.registerTranslator(key, t);
}
else {
System.out.println("[ClassLoader] "+c.getCanonicalName()+" will not be loaded. It is not a translator class");
}
}
}
else {
throw new Error("NOT IMPLEMENTED");
}