런타임시 사용자 지정 텍스트 변환기를로드하는 명령 줄 응용 프로그램 (명령 줄 arg를 통해 제공되는 클래스 파일/jar의 경로)에서 작업 중입니다. 기본적으로 나는 그 인수를 가져 와서 URLClassLoader를 만드는 데 사용하고 있습니다. 그런 다음 Transable 인터페이스를 구현하는 URLClassloader에서 사용할 수있는 모든 클래스를 찾아야합니다.Java, 특정 인터페이스를 구현하는 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");
}
그냥 jar 파일로 가서 모든 항목을 확인하십시오. – irreputable