2010-12-17 5 views
4

ClassLoader의 역할이 개별 클래스뿐만 아니라 종속성도로드한다는 것을 명확히 할 수 있습니까? 그렇다면 전체 프로세스가 정확히 무엇을 수반합니까? 가능하다면 구현 세부 사항을 찾고 있습니다.Java ClassLoader 및 종속성 해결

예를 들어, 어떤 시점에서 바이트는 네트워크 또는 파일 시스템 위치의 어딘가에서 읽어야하고 파일 시스템 위치는 클래스 표준 이름을 기반으로 계산되어야합니다. JVM에서 사용할 수있는 클래스 경로에 대한 예고 - 개별 ClassLoader는 잠재적으로 여러 클래스 경로를 통해 파일을 찾으려면 어떻게합니까? 이 정보는 어디서 얻을 수 있습니까? 또한, 클래스 파일 바이트가 검증되고 가용성에 대한 종속성이 어느 시점에서 검사됩니까? 가능한 한

으로 많은 세부 사항은 평가 될 것입니다 :

답변

6

클래스 로딩은이다 매우 복잡한 주제. ClassLoader와 Java 보안 모델은 서로 긴밀하게 연결되어 있습니다. 본질적으로 JVM은 요청에 따라 클래스를로드합니다. 클래스 로더의 계층 구조가있을 때, JVM은 클래스를 가능한 멀리 체인에서 내려 내려고 시도합니다. 즉, 클래스가 "boot"클래스 로더 및 응용 프로그램 정의 클래스 로더에 정의되어 있으면 클래스는 항상 부트 클래스 로더에서 해당 버전을 사용합니다.

URLClassLoader와 같은 클래스 로더 내에서 검색 순서는 사용자가 보도록 지시 한 순서입니다. 본질적으로 클래스가 있다고 말한 URL 배열은 첫 번째 항목에서 마지막 항목까지 검색됩니다.

정의한 클래스가 다른 클래스를 참조 할 때 해당 클래스도 동일한 알고리즘을 사용하여 해석됩니다. 그러나 여기 잡기가 있습니다 : 발견 된 곳을 기준으로 만 해결됩니다. SomeCoolThing 클래스가 부트 클래스 로더에 있지만 시나리오 정의 클래스를 사용하는 SomeLameThing에 의존하는 시나리오를 살펴 보겠습니다. 이 과정은 다음과 같을 것이다 : SomeLameThing 당신이 SomeCoolThing를 요청한 클래스 로더에 비록

App-ClassLoader: resolveClass("SomeCoolThing") 
    parent->resolveClass("SomeCoolThing") 

Boot-ClassLoader (the ultimate parent): resolveClass("SomeCoolThing") 
    SomeCoolThing needs SomeLameThing 
    resolveClass("SomeLameThing") // Can't find SomeLameThing!!!! 

는 SomeCoolThing 다른 클래스 로더에서 해결되었습니다.그 다른 클래스 로더는 자식 클래스 로더에 대한 지식이없고 스스로 해결하려고 시도하고 실패합니다.

Java ClassLoader를 다루는 책을 오래 전부터 가지고 있었으며, 나는 그것을 권장합니다. 그것은 Java Security by O'Reilly Media입니다. ClassLoader를 다룰 때 그리고 배우는 방법에 대해 알고 싶지는 않지만 여전히 필요로하는 모든 질문에 대답합니다.

+0

"항상 부트 클래스 로더에서 버전을 사용합니다"라고 말하면서 정확하지 않습니다 - 포함하여 모든 상위 클래스 로더 사용 부트 로더는 부모 클래스에 적절하게 위임 한 하위 클래스 로더에 의존합니다. 실험으로이 클래스를 고의적으로 위반했고 부트 로더가 하위 로더에서 찾을 수있는 클래스를로드했습니다 (전반적으로 너무 잘 작동하지는 않았지만). –

+0

나는 같은 실험을했고 같은 결과를 얻었다. 간단히 말해 클래스 로딩 시스템이 작동하도록 설계된 방식을 설명했습니다. 필자가 언급 한 책은 내가 쓸어 내야 할 세부 사항을 명확히 할 것이다. –

+0

감사합니다 베린, 내가 찾고있는 정확하게 수준의 정보이며, 나는이 책을 체크 아웃 할 것이다 :). 하지만 좀 더 문제가 될 수 있다면 - 소스 코드에서 런타임 네임 스페이스에 이르는 클래스의 실제 도입은 어디에서 발생합니까? ClassLoaders는 해결 과정에서 소스 코드를 바이트 코드로 컴파일합니까? 다시 한 번 감사드립니다! – VLostBoy

0

내가 당신의 몇 가지 질문에 대답 할 수

어떻게 개인 클래스 로더가 잠재적으로 여러 클래스 경로를 통해 파일을 찾습니다 을 시도 않습니다 ?

다른 클래스 로더가 다른 클래스 경로를 가지고 있다는 것을 의미하면 각 클래스 로더는 부모 클래스 로더의 속성 (즉, 클래스 경로)을 사용합니다. 모든 클래스 로더는 다른 클래스 패스와 같은 클래스 패스를가집니다 (JVM이 이상하게 작동하는지 확실하지 않습니다). 그래서 MyClass.class는 클래스 로더와 모든 자식 클래스 로더에 대해 동일합니다. 동일한 클래스 경로에 여러 개의 MyClass.class가 정의되어 있으면 JVM이 첫 번째 클래스를 선택합니다. 과거에는 내 자신의 클래스 로더를 작성하고 기존 클래스 경로에 사용자 정의 클래스 경로를 추가하여 실행시 클래스 경로를 시작할 때 클래스 경로에없는 클래스를로드했습니다.

Nuts and Bolts를 얻으려면 JVM 코드 (어셈블리/C/C++ 코드)를 다운로드하여 읽을 수있는 스펙이 있지만 거기에 대해서는 확신하지만 그것을해야하고 "그것은 예쁘지 않다".

물론

"그들이"... 내가 그 일을 진행하는 방법을 잘 모르겠어요 1.7의 클래스 경로 물건을 변경

조금 도움이

희망 ...

+0

피드백을 보내 주셔서 감사 드리며 1.7에서 변경 사항을 살펴 보겠습니다. – VLostBoy