2_____ 부모 위임 모델의 학습 클래스 로딩 메커니즘

     우리는 일반적인 배운 전에 학습함으로써 로더의 세 가지 유형 BootstrapClassLoader, ExtClassLoader, APPClassLoader을, 사용자가 사용자 정의 클래스 로더에서 추상 클래스의 클래스 로더를 () 상속 (때문에) findClass를 다시 작성할 수 있습니다. 그럼 어떻게 글로벌 고유성 클래스를 확인하는 클래스를로드? ? ? 우리는 JVM의 부모 메커니즘 로딩 메커니즘 클래스 로더를 임명하기로 합의 사용합니다.

부모 위임 모델 :

     부모 위임 모델에서, 부트 클래스 로더 (BootstrapClassLoader)에 추가하여, 각 클래스는 다음과 같은 수퍼 클래스 로더가로드가 있습니다 AppClassLoader 슈퍼 클래스 로더가 ExtClassLoader입니다, 사용자 정의 클래스 로더는 AppClassLoader이다. 실제 클래스 로더는, 현재의 클래스 로더가 직접 클래스를로드 할 수 없습니다, 그러나 그들의 슈퍼 클래스 로더, 슈퍼 클래스 로더에 위임 작업을로드 한 후 자신의 슈퍼 클래스 로더에 위임하고자하는 경우, 이 최고 부트 클래스 로더 (BootstrapClassLoader)에 도달 할 때까지 슈퍼 클래스 로더가 할당 된 클래스를로드 할 수없는 경우, (위 그림 참조) 다음 단계 로더를 소유 할 작업을로드에 전달됩니다.

    위임 장점 부모 메커니즘 : 클래스 로더는 부하를 수행 동일한 유형의 완전한 이름의 복수의 프로그램이 (com.user.Test과 같은 두 가지 범주가 호출) 할 때 발생시 효율적으로, 전 세계적으로 유일한 클래스를 보장 할 수 있습니다 항상 클래스 중 하나를로드 할 때,이 클래스는로드를 수행하지 않습니다.

    부모는 독서의 소스 모델을 위임 :

보호 클래스로 loadClass (<?> 문자열이 var1은 부울 VAR2가) 발생 의 ClassNotFoundException를 {
         동기화 ( 다음은이 .getClassLoadingLock (VAR1가)) {
             // 먼저 확인이 이미 입력하기 전에 목표를 통해로드 된 
            클래스 var4 = 다음은이 ; .findLoadedClass (VAR1)
             IF (var4 == NULL이 ) {
                  VAR5 = System.nanoTime ()에; 

                은 try {
                     // 슈퍼 클래스가있는 경우 슈퍼 클래스 로딩에 위임 할 수 
                    IF ( 다음은이 ! .parent = 널 (null) ) { 
                        var4 =다음은이 (VAR1, .parent.loadClass false로 ); 
                    } 다른 {
                        // 클래스 로더로드 부팅에 직접 위임 슈퍼 클래스가있는 경우 
                        var4는 = 다음은이 .findBootstrapClassOrNull (VAR1); 
                    } 
                } 캐치 (ClassNotFoundException가의 var10) {
                    // 예외가 발생 될 때 ClassNotFoundException가 부팅 클래스 로더가 실패 설명 
                    ; 
                } 

                경우 (var4 == NULL을 ) {
                 // 이 피곤 로더를 초과하는 경우로드 할 수 없습니다. 자동 적재가 진행 
                     Var7 = = System.nanoTime에를 ();
                    var4 .findClass (VAR1); 
                    . PerfCounter.getParentDelegationTime () addTime (var7 - VAR5); 
                    . PerfCounter.getFindClassTime () addElapsedTimeFrom (var7); 
                    . PerfCounter.getFindClasses () 증가분 (); 
                } 
            } 

            경우 (VAR2) {
                 .resolveClass (var4); 
            } 

            반환 var4을; 
        } 
    }

추천

출처www.cnblogs.com/xbfchder/p/11412244.html