2011-03-21 2 views
11

지금까지 사용자 정의 ClassLoader에 대해 본 적이있는 예제는 URLClassLoader를 서브 클래 싱하고 해당 특정 인스턴스를 사용하여 클래스를 리소스로로드하는 것과 관련이 있습니다.클래스의 대체 시스템 클래스 로더 Jars가 포함 된 Jar에서

SystemClassLoader를 대체 할 대체 방법을 찾으려고 노력했습니다. 따라서 ClassLoader는 클래스 경로에없는 클래스에 대해 문의 할 수 있습니다.

나는 Thread.currentThread().setContextClassLoader을 시도했지만 작동하지 않는 것 같습니다.

심지어 가능합니까? java.system.class.loader 속성

+0

"클래스 패스에없는 클래스에 대해 내 ClassLoader를 참조 할 수 있도록"라고 말하면 java.lang. * 등의 일반적인 시스템 클래스를 의미합니까, 아니면 추가 타사 클래스를로드 할 의향입니까? – Pacerier

+0

타사 클래스 ... – Olaseni

답변

8

실행 JVM :

java -Djava.system.class.loader=myClassLoader myApplication 
+3

JVM 명령 줄 수정을 방해하는 해결책을 찾고 있는데 – Olaseni

+0

시스템 클래스 로더를 바꾸려면 해당 솔루션이 없습니다. 독점적 인 클래스 로더를 코드로 작성하여 클래스를로드하는 데 사용할 수 있지만 시스템 클래스 로더는 아닙니다. 보통 독점적 인 클래스 로더를 만드는 것은 대부분의 경우에 충분한 해결책입니다. – Tarlog

11

이 오래된 질문이지만은, 실제로 시스템 클래스 로더를 대체하는 방법이있다. 리플렉션을 통해 당신보다 더 많은 것을 얻을 수 있습니다.

 Field scl = ClassLoader.class.getDeclaredField("scl"); // Get system class loader 
     scl.setAccessible(true); // Set accessible 
     scl.set(null, new YourClassLoader()); // Update it to your class loader 

이것은 Oracle JVM에서 작동합니다.

+2

이것은 물론 자바 버전간에 변경할 수있는 개인 변수에 따라 해킹이 가능하지만, System.getClassLoader()를 호출하여 클래스를로드하는 제 3 자 종속성의 한 병 및 코드 문제를 해결할 수있었습니다 . one-jar의 클래스 로더를 to로 이동하면 트릭이 실행됩니다. – Gus

+0

@Xyene 내 작업을 마친 후에 클래스 로더를 URLClassLoader.getSystemClassLoader()에 다시 추가하면 애플리케이션 동작이 문제가되지 않습니까? – ha9u63ar

+0

@ ha9u63ar 유스 케이스에 달려 있다고 생각합니다. 주의하지 않으면 클래스에 가시성 문제가 발생할 가능성이 큽니다 (예 : 시스템 클래스 로더에서로드 된 클래스 A는 클래스 B를 볼 수 없습니다). 그런 일을한지 몇 년이 지났지 만, 시스템 로더를 되 돌리는 것이 도움이되지 않을 수도 있습니다. – Xyene