번들 A와 번들 B가 있습니다. 번들 B는 번들 A에서 패키지를 가져오고 번들 B는 번들 A로 Eclipse-RegisterBuddy를 가져옵니다. 번들 A는 B에서 내 보낸 클래스를로드합니다. 자바 리플렉션 (Class.forName). 번들 B가 재배포 될 때 번들 A는 이전 버전의 B에서 여전히 클래스 로더에 대한 참조를 가지므로 Class.forName은 B에서 이전 클래스 버전을 반환합니다. 이로 인해 인수가 B로 작성되고 전달 된 경우 A에서 Class.isInstance를 호출하면 false가 반환됩니다. A.에서 메서드로 B에서 클래스의 새 버전을 반환 할 수있는 클래스 로더를 새로 고치려면 몇 가지 방법이 있습니까? 처녀 자리 콘솔에서 번들 새로 고침 A 명령을 호출 할 수 있지만이 문제가 해결되지만이 새로 고침을 통해 모든 종속 번들 (B 및 기타)이 중지되었다가 다시 시작됩니다. 번들 B 및 A에서 패키지를 가져 오는 다른 패키지는 장시간 실행되는 일괄 처리 작업이므로 중지 할 수 없으므로 이는 응용 프로그램에 적합하지 않습니다.Eclipse Virgo - 클래스 로더가 번들 재로드 후 이전 클래스를 반환합니다.
0
A
답변
0
가 Class.forName()은은 OSGi에서 안티 패턴, 즉 사용하지 마십시오 : http://wiki.osgi.org/wiki/Avoid_Classloader_Hacks
당신은 당신의 클래스에 대한 인터페이스를 만들어야합니다. 인터페이스는 안정이어야합니다. 이 인터페이스를 번 B.API과 같은 별도의 번들에 넣어야합니다. 번들 A에서는 클래스 대신이 인터페이스를 사용해야합니다. 별도의 번들에서 안정적인 인터페이스를 사용하면 B를 새로 고침해도 종속 번들이 다시 시작되지 않습니다.
옵션 1
당신은 OSGi 서비스 및 라이프 사이클에 생각한다 : 당신은 당신이 원하는 인스턴스를 얻을 수있는 몇 가지 옵션이 있습니다. 번들 B는 번들 A가 사용하는 OSGi 서비스를 등록해야합니다. ServiceTracker를 작성하거나 Declarative Services를 사용하여 서비스를받을 수 있습니다.
옵션 2
당신은 내가 옵션 2를 권장하지 않는 옵션 1을 선택해야합니다,하지만 당신은 몇 가지 이유 때문은 OSGi 서비스를 사용하지 않으려면이 작업을 수행 할 수 있습니다. 번들 B를 번들 A로 가져옵니다. bundleB.loadClass()을 사용하여 클래스 유형을로드하고 B.API에있는 인터페이스로 전송합니다.