DLL 자체를 사용하는 대신, 일종의 플러그인 아키텍처가 필요합니다.
필요하지 않은 한 DLL 사용을 권장하지 않는 한 가지 이유는 Java 코드를 원시 코드와 연결하는 데 순수한 Java 솔루션보다 많은 노력이 필요한 Java Native Interface (JNI)을 사용해야한다는 것입니다.
상대적으로 간단한 방법은 Java의 reflection 기능을 사용하는 것입니다.주어진 정보에서
, 나는 아마 다음의 라인을 따라 갈 것 :
- 는 출력 형식에 대한 인터페이스를 정의합니다.
- 인터페이스를 구현하는 Java 클래스를 만듭니다.
- classpath에서 수업을 받으십시오.
- 리플렉션을 사용하여 동적으로 클래스를로드하십시오. 합니다 (
Class.newInstance
방법을 사용하면 ClassLoader
에 의해로드 class
파일에서 객체를 생성 할 수 있습니다.) 다음 단계로
, 전체를 필요로하지 않을 단순한 플러그인을 구현할 수있을 것이다 재건 할 때 새로운 형식에 대한 지원 필요합니다.
1 단계 : 정의
이의 우리가 같은 인터페이스 결국 가정 해 봅시다 인터페이스 다음
public interface Outputter {
public void write(Data d);
}
2 단계 : 확인 구현 클래스
그런 다음 구현 클래스를 만듭니다.
public class TextOutputter {
public void write(Data d) {
// ... output data to text
}
}
그런 다음, 위의 컴파일, 우리는 TextOutputter.class
라는 class
파일을하게 될 겁니다.
3 단계 : 주요 응용 프로그램을 실행하면 클래스 경로
에서 클래스가 사용할 수 있도록, 우리는 classpath 위 TextOutputter.class
을해야합니다. 일반적으로 JVM에게 classpath로 고려해야 할 곳 목록을 알려주고, 위의 class
파일을 포함해야합니다.
일단 완료되면 리플렉션을 사용하여 위의 클래스를로드 할 수 있어야합니다.
4 단계 :
// Note: We load the class by specifying the fully-qualified class name!
Class<?> clazz = Class.forName("TextOutputter");
// Then, we instantiate the class.
// Note that the following method will call the no-argument constructor.
Outputter outputter = clazz.newInstance();
// Now, we can give data to the TextOutputter object that we loaded dynamically.
outputter.write(...);
Class.forName
방법 : 우리가 실제로 위의 클래스를로드 할 때 동적으로 이제 반사
를 사용하여 클래스를로드, 우리는 다음과 같이 뭔가를 할 것 는 ClassLoader
에서 TextOutputter
클래스를 찾기 위해 사용됩니다. 클래스를 Class
표현으로 얻으면 클래스의 객체를 인스턴스화 할 수 있습니다.
개체의 인스턴스화는 Class.newInstance
메서드를 사용하여 수행 할 수 있습니다. 인수가없는 생성자 이외의 것이 사용되어야한다면 클래스의 Constructor
을 가져 와서 거기에서 객체를 인스턴스화해야합니다.반사 후 Outputter
변수에 배치되므로 write
방법은 TextOutputter
호출 할 수 통해
오브젝트가 인스턴스화.
더 많은 형식을 추가하면 위의 과정이 수반되지만 정규화 된 클래스 이름을 변경하면 (예 : String
의 경우 FQCN은 java.lang.String
) 다른 클래스를로드하는 데 필요한 것입니다. 간단히 말해서
, 즉 동적으로
class
파일을로드하고 응용 프로그램에서 사용하는 데 걸리는거야.
(그냥 보조 노트로, 실제로 위의 코드를 컴파일하지 않았다, 그래서 여기 저기 약간의 오차가있을 수 있습니다,하지만 난이 걸릴 것입니다 과정을 설명 할 수 있기를 바랍니다.)
예, JNI 및 동적 네이티브 라이브러리 (고성능 또는 특정 외부 라이브러리에서 래퍼로 POJO를 사용하는 경우)가 필요한 클래스를 사용하려는 경우가 아니라면이 방법이 효과적입니다. DLL에 바인딩 된 클래스를 표준 클래스 로더로 다시로드 할 수 없으므로이 경우 하위 클래스에 바인딩해야합니다. – dweeves
자바의 최신 버전에서는 서비스 제공 업체 메커니즘 (java.util.ServiceProvider)을 사용하여 플러그인 항아리에서 플러그인 구현로드를 표준화 할 수 있습니다. – jtahlborn
@dweeves : 클래스 로더를 서브 클래스 할 필요가 없습니다. 별도의 클래스 로더를 사용하여 dll을 언로드하려는 경우 삭제해야합니다. – jtahlborn