2012-02-09 5 views
3

(끔찍한 제목, 내가 아는)는Java는 이미 System ClassLoader에 의해 다른 클래스에 의해로드 된 클래스를로드하는 방법이 있습니까?

이것을 설명하는 가장 좋은 방법은, 이미 클래스의 인스턴스에 대한 참조를 가지고 내가 이러한 클래스함으로써, URLClassLoader의에서 런타임에로드 할 몇 가지 클래스를로드 할 필요가 있다는 것입니다 System ClassLoader에 의해로드되고 다른 문제로 인해 다시로드 할 수 없습니다.

또한 시스템 클래스 로더를 사용하여 클래스 경로의 jar 파일에서 클래스를로드 할 수 있도록 코드를 변경하려고합니다.하지만 그렇게 할 수 없었습니다.

답변

3

아니요. 모든 클래스 로더는 상위 클래스로 부트 스트랩 클래스 로더를 갖고 있으며 클래스 로더에 이미 정의 된 클래스를로드하려고하면 조상의 버전이 사용됩니다. 이것은 java.lang.Object 및 기타 내장 함수가 재정의되는 것을 방지하기위한 것입니다. javadoc for ClassLoader에서

:

ClassLoader 클래스는, 클래스 및 자원을 검색하기위한 위임 모델을 사용합니다. ClassLoader의 각 인스턴스에는 연결된 상위 클래스 로더가 있습니다. 클래스 또는 리소스를 찾도록 요청되면 ClassLoader 인스턴스는 클래스 또는 리소스 자체를 찾기 전에 해당 클래스 또는 리소스에 대한 검색을 부모 클래스 로더에 위임합니다. "부트 스트랩 클래스 로더"라고하는 가상 머신에 내장 된 클래스 로더 자체에는 부모가 없지만 ClassLoader 인스턴스의 부모 역할을 할 수 있습니다.

당신은이 findClass에 의해 호출하지 않고 defineClass를 노출하는 사용자 정의 클래스 로더를 정의하고 findClass에서 일어나는 대표단을 방지 할 수 있습니다,하지만 난 parent.findClass(className)이 존재하는 경우에 모두의 JVM에서 의도 한대로 작동 defineClass(className, bytes)에 의존하지 않을 것입니다.

+0

아무것도 ClassLoader의 특정의 구현/서브 클래스가 실제로이 동작을 구현하도록 (듯이) 강제합니다. – bmargulies

+0

@bmargulies, 나는'resolveClass'가 위임을 구현하고 그것이로드되고 초기화 된'Class' 인스턴스의 모든 생산에 대한 게이트 키퍼 인'resolveClass'가 최종적인 인상을 받고있었습니다. –

+0

resolveClass의 javadoc에 'may'이라는 단어가 있음에 유의하십시오. – bmargulies

1

예. 다른 클래스 로더를 정의하고 클래스를로드 할 수 있습니다.

사양

"런타임에 클래스 또는 인터페이스가 혼자 이름으로 판단한다 당으로

하지만, 한 쌍 :. 정규화 된 이름과 정의 클래스 로더 이러한 각 클래스 또는 인터페이스가 속한 클래스 또는 인터페이스의 런타임 패키지는 패키지 이름 및 클래스 또는 인터페이스의 클래스 로더 정의에 따라 결정됩니다. "

0

예. 그러나 기본 상위 클래스 로더는 부트 클래스 로더가 아닌 시스템 클래스 로더이므로 약간주의해야합니다. java.net.URLClassLoader.newInstance(myURLs, null)을 사용하는 것이 좋습니다. 플래시를 원할 경우 시스템 클래스 로더에서 상위 클래스 로더를 가져 오면 확장 클래스가 포함됩니다.

는 (참고 용어는 클래스 경로는 설치에 대한 (통증이) 그래서 시스템 클래스는 시스템 클래스 로더에 의해로드되지 않습니다. bootclasspath에 지금의 포함 때 자바 2 이전에서 날짜 때문에 약간 비틀어 없습니다.)