実行時にユーザー指定のテキスト トランスレータをロードするコマンド ライン アプリに取り組んでいます (コマンド ライン引数を介して提供されるクラス ファイル/jar へのパス)。基本的に、私はその引数を取得し、それを使用して URLClassLoader を作成しています。次に、Transable インターフェースを実装する URLClassloader で使用できるすべてのクラスを見つける必要があります。
現時点では、このコマンド ライン引数がクラス ファイルを含むディレクトリであることのみを許可しています。ソリューションをかなりシンプルにします (以下のコード)。しかし、正直なところ、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");
}