我正在使用命令行应用程序在运行时加载用户指定的文本翻译器(通过命令行参数提供的类文件路径/ jar)。基本上我采取了这一论点,并用它来创建一个URLClassLoader。然后,我需要找到可用于实现Transable接口的URLClassloader的所有类。Java,获得实现特定接口的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");
}
只需进入jar文件并检查所有条目。 – irreputable 2011-02-17 00:32:17