우리는 일반적인 배운 전에 학습함으로써 로더의 세 가지 유형 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을; } }