찾다

 >  Q&A  >  본문

java - 所有类都是由Object类的记载器加载的吗?

看到网上这么说:

双亲委派机制描述
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

首先将加载任务委托给父类加载器,依次递归 这句话的意思是所有类都是由Object类的记载器加载的吗?

大家讲道理大家讲道理2802일 전634

모든 응답(3)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-18 10:50:25

    자바 가상 머신의 첫 번째 클래스 로더는 부트스트랩입니다. 이 로더는 자바 가상 머신 커널에 중첩되어 있으며 C++로 작성된 바이너리 코드입니다.

    위임 메커니즘을 사용하면 상위 클래스가 재귀적으로 검색됩니다. 즉, 부트스트랩을 사용하여 로드를 시도하고, 찾지 못하면 내려가는 것이 좋습니다. 두 개의 바이트코드 복사본이 메모리에 나타나는 것을 방지합니다.

    ClassClassLoader를 오해하셨네요.

    클래스가 기록되면 먼저 현재 스레드의 클래스 로더를 사용하여 스레드의 첫 번째 클래스를 로드합니다. 예를 들어 이 클래스는 ClassA이고 클래스 로더는 ClassLoaderA입니다.

    ClassA가 ClassB를 참조하는 경우 시스템은 ClassLoaderA를 사용하여 ClassB를 로드합니다.

    현재 2개의 클래스가 있습니다(간소화 버전, 실제로는 2개 이상의 클래스).

    ClassX와 ClassY가 메모리에 로드되고 둘 다 ClassZ를 참조하는 상황을 가정해 보겠습니다. 그러면 누가 ClassZ를 로드합니까?

    분명히 위에서 설명한 로딩 단계에 따르면 ClassZ의 사본 2개가 나타납니다. ClassX는 한 번 로드되고 ClassY는 다시 로드됩니다. ClassY는 ClassX가 로드되었음을 모르기 때문입니다.

    이 문제를 해결하는 방법은 상위 클래스를 재귀적으로 검색하는 것입니다.

    구체적인 단계는 먼저 BootstrapClassLoader에서 검색하는 것입니다. BootstrapClassLoader가 이 클래스를 로드한 경우 이를 반환합니다. BootstrapClassLoader가 이 클래스를 로드하지 않은 경우 이 클래스를 찾을 때까지 계속 검색합니다. 이 스레드의 클래스 로더를 찾을 수 없으면 클래스가 로드되지 않았음을 의미하며 현재 스레드의 로더를 사용하여 이를 로드합니다. getContextClassLoader()을 사용하여 현재 스레드의 클래스 로더를 가져올 수 있습니다.

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 10:50:25

    Java에는 시스템 클래스 로더와 사용자 정의 클래스 로더라는 두 가지 유형의 클래스 로더가 있습니다.

    시스템 클래스 로더에는 로딩 경로 제한이 있습니다. 예를 들어 JDK1.6에서는 Bootstrap Class Loader,
    System.getProperty("sun.boot.class.path")을 통해 클래스 로딩 경로

    를 얻을 수 있습니다. 으아아아

    이 경로의 클래스는 Bootstrap에 의해 처리됩니다. 다른 경로의 클래스가 Bootstrap으로 재귀되어 클래스 파일을 찾을 수 없으면 다음 레벨 클래스 로더가 해당 경로에 로드합니다.

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 10:50:25

    위의 말씀이 맞습니다. jvm에 대한 자세한 내용은 관련 서적을 읽어보시길 권합니다.

    회신하다
    0
  • 취소회신하다