我正在使用命令行應用程序在運行時加載用戶指定的文本翻譯器(通過命令行參數提供的類文件路徑/ 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