2009-05-18 12 views
0

"addon"인터페이스가 필요한 Java 프로젝트가 있습니다. 클래스가 응용 프로그램에로드 된 후 initialize()shutdown()과 같은 기본 메서드가있는 클래스 파일을로드하려고 생각했습니다. 이것을하는 방법입니까? 이 문제에 어떻게 접근합니까?Java 클래스를 포함하고 런타임 중에이를 실행하십시오.

+0

동적으로 클래스를로드하거나 클래스의 초기화 동작을 정의 하시겠습니까? –

+0

클래스를 동적으로로드합니다. – Baversjo

답변

3

Class 클래스, 특히 forName 메서드를 살펴보면 이름으로 클래스를 참조 할 수 있습니다. 경로의 모든 클래스를 이와 같이로드 할 수 있습니다. 을 다시로드 할 수 있는지 여부는 알 수 없습니다.

동적으로로드하려는 각 클래스는 사용자 정의 AddOn 인터페이스를 구현해야하므로 initializeshutdown을 구현해야합니다.

+0

이것은 효과가 있습니다! 이것이 올바른 방법 일지 모르겠다. 나는 피드백에 만족한다. 이 클래스는 하나의 클래스를로드하는 데에만 사용됩니다. Classfoo = Class.forName ("addonclass"); 개체 foo = null; Object [] foo2 = null; classfoo.getMethod ("initialize"). invoke (foo, foo2); – Baversjo

+0

듣고 행복하게 작동합니다! 나 자신도 "올바른"방법에 대한 피드백에 관심이 있습니다. 나는 더 우아한 방법이 존재한다는 느낌을 가지고있다 ... – Stephan202

+0

"나는 더 우아한 느낌이있다." 아니요, 문서화 된 올바른 방법입니다. – Jay

-1
public class SomeClass { 
    static { 
     System.out.println("Being called with the class is loaded"); 
     initialize(); 
    } 
    static void initialize(){} 
} 

귀하의 질문입니까?

+0

Nice :)하지만 어떻게 파일에서 클래스를로드하고 실행할 수 있습니까? 클래스는 응용 프로그램과 함께 제공되지 않습니다, 사용자는 addon을 "다운로드"하고 "addons"폴더에 추가합니다. 응용 프로그램은 시작할 때 모든 애드온을로드합니다. – Baversjo

+0

Yeap. 나는 실제로 당신의 질문이 처음에 무엇인지 파악하지 못했습니다. Class.forName은 꽤 많은 방법입니다. – OscarRyz

1

먼저, ClassLoader; getClass().getClassLoader()으로 현재의 것을 얻을 수 있지만 addon 클래스는 classpath에 있어야합니다. 아마도 addon 디렉토리를 검색하는 커스텀 클래스 로더를 생성하고 싶을 것이다.

ClassLoader을 얻은 후에는 load a class에 사용할 수 있습니다. 그러면 Class 개체가 생깁니다. 그런 다음 반사를 사용하여 initialize() 메소드가있는 경우 해당 메소드를 호출 할 수 있습니다.

+0

비표준 방식으로 클래스를로드하려면 클래스 로더 만 있으면됩니다. 클래스가 클래스 경로의 폴더에 ".class"파일로 존재하면 표준 클래스 로더가이를 수행합니다. 인터넷에서 클래스를 다운로드하려는 경우 사용자 정의 클래스 로더가 필요합니다. – Jay

0

addons를 실현하는 또 다른 좋은 방법은 java.util.Serviceloader입니다. javadocs를 살펴보면, 그들은 원리를 설명한다.

1

좀 더 세련된 것을 본다면, http://jpf.sourceforge.net을 시도해 볼 수 있습니다.

... JPF는 "플러그인"을 동적으로 검색하고로드하는 런타임 엔진을 제공합니다. 플러그인은 "매니페스트"를 사용하여 JPF에 대해 설명하는 구조화 된 구성 요소입니다. ...

관련 문제