2010-04-26 2 views
1

그래서 194698 질문은 런타임에 jar 파일을로드하는 방법을 보여줍니다. 개별 명명 된 클래스를로드하고 Class 객체를 가져올 수 있습니다. 이제 내 문제는 그 클래스를 실제 타입으로 캐스팅 할 수 있기를 원하지만, 컴파일 시점보다는 런타임에로드하기 때문에 가져 오기를 사용할 수 없기 때문에 할 수 없다.그래서 런타임시 jar를 동적으로로드합니다. 어떻게 사용합니까?

리플렉션을 사용하여 함수 및 필드 이름을 검색하는 방법이 있지만 jar 파일의 API가 변경 될 수 있고 코드가 실행될 때까지 손상되지 않으므로 약한 것처럼 보입니다.

더 좋은 방법이 있습니까?

답변

3

일반적인 방법은 잘 정의 된 인터페이스를 통해 동적으로로드 된 클래스를 사용하는 것입니다 (연결된 질문의 대답에 표시된대로 Runnable으로 표시). 그렇게하면 구현 세부 사항이 인터페이스를 구현하는 한 자유롭게 바뀔 수 있습니다. 따라서로드 된 클래스의 인스턴스를 try 블록 내부의 해당 인터페이스로 캐스팅하고, 클래스가 인터페이스를 구현하지 않은 경우에 대비하여 ClassCastException을 잡아서 처리합니다 (위의 대답에는 표시되지 않지만 추가는 쉽지 않음). 그것을 영원히 행복하게 사용하십시오.

+0

그래, 맞아. – justinhj

1

당신은 당신이 그들을 사용하는이 "확장 일반적으로

(사람들이 이미 인터페이스를 알고 고투) 전혀 또는 거의 가능성이 무엇 클래스를 사용할 수 없으며 그들이 가지고있는 인터페이스가 알고하지 않은 경우 모듈은 특정 인터페이스에 코드화되므로 새로운로드 된 클래스에는 항상 특정 메소드가 있습니다 (예 : JDBC 드라이버는 PreparedStatement 구현, ResultSet 등을 발견 할 것으로 항상 기대합니다)

귀하의 경우 및 임의의 클래스를로드하고 사용하려는 경우, 볼 수있는 유일한 나머지 리소스는 일부 메커니즘을 제공하는 것입니다. o 발견 된 인터페이스에 스크립팅 언어 (예 : Groovy, Jython 또는 JRuby)와 코드를 추가하십시오.

관련 문제