2012-02-08 5 views
5

저는 추상 클래스를 사용하여 사람들이 자체 구현을 작성할 수 있도록하는 응용 프로그램을 보유하고 있습니다. 이러한 구현을 디렉토리에서 .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 패키지로 컴파일해야한다는 것은 매우 잘못된 것이라고 생각합니다.

그래서 물어 봅니다. 파일 시스템에있는 패키지를 지정하지 않고 클래스를로드 할 수있는 방법이 있습니까?

+1

경로 아래에 패키지 구조를 폴더 구조로 유지할 수 있습니까? 클래스를로드하기 전에 경로에서 패키지 이름을 만드시겠습니까? –

+0

그럴 가능성이 있습니다 ... 적어도 두 클래스가 같은 이름을 가지고있을 때 나는 스스로를 괴롭힐 필요가 없을 것입니다. 다른 각도에서 생각하는 것이 좋습니다! :) –

+0

시도해보고 작동하는지 확인하십시오. 일부 코드 예제를 알려 주시면 감사하겠습니다. –

답변

3

예; 인터페이스를 구현 (또는 주석을 사용).

그런 다음 특정 클래스를로드하려면 클래스 스캐닝 라이브러리 (이에 대한 많은 질문이 있습니다, 예 : this one)를 사용하십시오. "Java class scanning"또는 "Java plugin mechanism"을 검색하면 도움이됩니다.

Java Plugin Framework을 사용하고 싶지 않을 수도 있습니다. 더 이상 유지 관리되지 않는다고 분명하지 않지만 사람들이 여전히 사용하고 있다는 것을 알고 있습니다.

+0

필자의 경우 인터페이스가 올바르게 (의미 적으로) 작동하지 않을 것이라고 생각합니다. 'AbstractClass'는 구현의 오버라이드 (override, wtf?) 메소드만을 사용하는 미리 정의 된 많은 함수를 가지고 있습니다. 인터페이스가 허용하지 않습니다. –

+0

@FlorianPeschka ... 같은 차이. –

+0

귀하의 의견을 이해할 수 없습니다. 무슨 차이가 있니? –

관련 문제