저는 추상 클래스를 사용하여 사람들이 자체 구현을 작성할 수 있도록하는 응용 프로그램을 보유하고 있습니다. 이러한 구현을 디렉토리에서 .class-files로로드합니다. 현재, 나는이 해결책을 가지고있다 :패키지를 지정하지 않고 폴더에서 클래스를로드하십시오.
File classDir = new File("https://stackoverflow.com/users/myproject/classes/");
URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);
String filename;
for (File file : classDir.listFiles()) {
filename = string.getFilenameWithoutExtension(file);
if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
continue;
AbstractClass instance = (AbstractClass)urlLoader
.loadClass("org.mypackage." + filename)
.getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
.newInstance(config, database, string));
instance.doSomething();
}
알다시피 - 올바르게로드하려면 클래스가있는 패키지를 지정해야한다. 패키지를 생략하면
java.lang.NoClassDefFoundError:
MyClass (wrong name: org/mypackage/MyClass)
오류가 발생합니다.
이제 아키텍처 POV에서 다른 사람들이 설계 한 클래스를로드 할 때 MY 패키지로 컴파일해야한다는 것은 매우 잘못된 것이라고 생각합니다.
그래서 물어 봅니다. 파일 시스템에있는 패키지를 지정하지 않고 클래스를로드 할 수있는 방법이 있습니까?
경로 아래에 패키지 구조를 폴더 구조로 유지할 수 있습니까? 클래스를로드하기 전에 경로에서 패키지 이름을 만드시겠습니까? –
그럴 가능성이 있습니다 ... 적어도 두 클래스가 같은 이름을 가지고있을 때 나는 스스로를 괴롭힐 필요가 없을 것입니다. 다른 각도에서 생각하는 것이 좋습니다! :) –
시도해보고 작동하는지 확인하십시오. 일부 코드 예제를 알려 주시면 감사하겠습니다. –