클래스 로더
Java 클래스 로더는 런타임에 JVM에 필요한 클래스를 동적으로로드하는 것입니다. Java Class 로더는 세 가지 메커니즘을 기반으로합니다 : 대표, 가시 및 단일.
클래스 경로 아래의 .class 파일을 메모리에로드하고 바이트 코드로 처리하십시오. 이 작업은 클래스 로더에 의해 수행됩니다.
기본 클래스 로더
시스템은 기본적으로 3 개의 클래스 로더로 변합니다.
클래스 로더는 또한 Java 클래스이지만 부트 스트랩은 그렇지 않습니다. 확인 코드 :
public class classloaderTest {public static void main (String [] args) {System.out.println (System.class.getClassLoader ()); }}출력 : NULL
if System.out.println (System.Class.getClassLoader (). TOSTRING); NULL 포인터 예외 가보고됩니다.
스레드 예외 "main"java.lang.nullpointerexception에서 com.iot.classloader.classloadertest.main (classloaderTest.java:10)에서 sun.reflect.nativeMeThodAccessOrimpl.invoke0 (기본 메소드) sun.reflect.nativeMethodaccessorimpl.invoke (nativeMethodaccessorimpl.java:62) at sun.reflect.delegatingMethodaccessorimpl.invoke (java.lang.lang.rffect.method. at com.intellij.rt.execution.application.appmain.main (appmain.java:144)
알 수 있듯이 시스템 클래스는 부트 스트랩 클래스 로더에 의해로드됩니다.
클래스 로더 대의원 메커니즘
클래스 로더의 트리 다이어그램
클래스 로더
로딩 클래스의 일반 순서 :
사용자 정의 클래스 로더를 작성하는 방법
API :
클래스 클래스 로더
템플릿 방법 설계 패턴
학부모 수업 :
로드 클래스 (클래스로드 프로세스, 템플릿)
loadclass 메소드에 의해 호출 된 서브 클래스 재정의에 대한 클래스 클래스로드 로직을 찾으십시오.
정의 클래스 클래스 파일이 바이트 코드로 변환되었습니다
서브 클래스 : FindClass 메소드를 재정의합니다
예:
loadclass 메소드의 소스 코드
보호 클래스 <?> loadClass (문자열 이름, 부울 resolve)는 classNotFoundException {synchronized (getClassLoadingLock (name)) {// 클래스가 이미로드되었는지 확인 <?> c = findloadedClass (name); if (c == null) {long t0 = system.nanoTime (); try {if (parent! = null) {c = parent.loadclass (이름, false); } else {c = findBootStrapClassorNull (이름); }} catch (classNotFoundException e) {// null 부모 클래스 로더에서 //를 찾을 수없는 경우 classNotFoundException} if (c == null) {// 아직 찾을 수없는 경우 findClass를 호출하여 클래스를 찾으십시오. long t1 = system.nanoTime (); c = findClass (이름); // 이것은 정의 클래스 로더입니다. 통계를 기록하십시오 Sun.misc.perfcounter.getParentDelegationTime (). AddTime (T1 -T0); sun.misc.perfcounter.getfindclasstime (). addelapsedtimefrom (t1); sun.misc.perfcounter.getfindclasses (). increment (); }} if (resolve) {resolveClass (c); } 반환 c; }}API 문서의 예 :
클래스 네트워크 클래스 로더 확장 클래스 로더 {문자열 호스트; int 포트; 공개 클래스 findclass (문자열 이름) {byte [] b = loadClassData (이름); 정의 클래스를 반환합니다 (이름, b, 0, b.length); } private byte [] loadClassData (문자열 이름) {// 연결에서 클래스 데이터를로드합니다. . . }}