다른 Java 클래스 로더와 함께로드 된 구현을 사용하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1758241

  •  20-09-2019
  •  | 
  •  

문제

사람들이 플러그인 프레임 워크를 사용하여 특정 인터페이스의 구현을 제공 할 수있는 라이브러리를 작성하고 있습니다 (친숙한 경우 JPF). 플러그인은 클래스 경로에 저장되지 않습니다. 프레임 워크는 각 플러그인에 대한 클래스 로더를 제공하므로 인터페이스 "myinterface"의 "myimpl"이라는 구현이 요청되면 올바른 플러그인을 찾은 다음 해당 플러그인의 클래스 로더를 사용하여 클래스를로드하여 인스턴스를 만들 수 있습니다. 생성자에 대해 알고 있다면. 여태까지는 그런대로 잘됐다.

그러나 이제 해당 특정 구현에서만 사용할 수있는 메소드를 호출 해야하는 경우가 있습니다. 따라서이 작업을 수행 할 수있는 두 가지 방법이 있습니다.

방법 1 :

// Makes sure that MyImpl has been loaded, using the custom classloader
Plugins.getClass(MyInterface.class, "MyImpl");
// This line will not compile because MyImpl is not available at build time
MyImpl foo = new MyImpl();
// If I could get this far, this line would work:
foo.methodOnlyInMyImpl();

방법 2 :

// This call will get an instance of MyImpl (already written and tested)
MyInterface foo = Plugins.getInstance(MyInterface.class, "MyImpl");
// Compiler error because there is no MyInterface.methodOnlyInMyImpl method.
foo.methodOnlyInMyImpl()

방법 1은 클래스가 "정상"이고 플러그인을 통해 액세스 할 수없는 경우 코드를 작성하는 방법과 가장 유사하기 때문에 두 가지의 클리너입니다. 그러나 어느 쪽도 컴파일하지 않습니다.

지금까지 내가 생각해 낸 옵션 :
A. 방법 2를 사용하지만 반사를 사용하여 MethodonLyInmyimpl 메소드 호출을 수행하십시오 (제발, 아니요!)
B. 플러그인 클래스를 빌드 경로에 배치 한 다음 컴파일하는 방법 1을 사용하십시오. (내 현재 가장 좋아하는)
C. B + 플러그인이 설치되면 클래스 파일을 클래스 경로에있는 다른 디렉토리로 복사하여 시스템 클래스 로더가로드 할 수 있습니다 (다른 문제를 일으 킵니다).

그래서 내 질문은 다음과 같습니다.

  1. 더 나은 다른 아이디어를 놓치고 있습니까?
  2. B를 수행하면 런타임에 문제가 있습니까? 결국, MyIMPL을 사용하는 클래스는 아마도 시스템 클래스 로더를 사용하여로드되었을 것입니다. 그래서, 그것이 보 자마자 MyImpl foo, 시스템 클래스 로더를 사용하여 MyIMPL을로드하려고하지 않으려 고하지 않습니까?
도움이 되었습니까?

해결책

첫째, 실제 구현에 대해 구현해야 할 때 플러그인 메커니즘에서 어떤 이점을 얻을 수 있습니까? 플러그인은 인터페이스를 구현해야하며 인터페이스를 통해 구현을 사용할 수 있습니다.

나는 JPF와 더 유사하지 않지만 다른 클래스 로더로로드 할 때 Java 클래스는 호환되지 않습니다. 그러나 가능한 두 가지 방법은 다음과 같습니다.

  1. 인터페이스는 클래스 로더에 있고 플러그인 클래스 로더에는 클래스 로더가 부모로서 인터페이스가 동일합니다. 코드 2는 인터페이스에서 메소드가 고정 될 때 이에 따라 작동해야합니다.

  2. 직렬화를 사용할 수 있습니다. 이는 독립 클래스 로더간에 데이터 객체를 전송하는 것이 제한된 방법입니다. 두 개의 webapps 사이에 요청 매개 변수와 함께 크로스 컨텍스트 디스패치에 이것을 사용해야했습니다.

다른 팁

이전 질문에서 언급 된 Transloader라는 라이브러리가 있습니다. 소스의 URL은 다음과 같습니다. http://code.google.com/p/transloader/ .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top