모든 자바 프로그램은 자바 가상 머신(JVM)에서 실행됩니다. . 컴파일 후 Java 클래스는 플랫폼 으로 변환됩니다. 및 기계 독립적 바이트코드 , 컴파일된 클래스는 .class로 저장됩니다. 파일. 사용하려고 할 때마다 ClassLoader 해당 클래스를 메모리에 로드합니다. 클래스는 이름으로 참조될 때 Java 환경에 도입됩니다. 클래스 로드는 클래스 실행이 시작되면 클래스 로더에 의해 수행되고 main() 메소드는 해당 클래스를 시작하는 방법입니다.
Java 9의 클래스 로더에 약간의 변경 사항이 있습니다.
- 시스템 클래스 로더 URLClassLoader, 의 인스턴스인 Java 9에는 더 이상 없습니다. 오히려 내부 클래스입니다. 기본 로더입니다. 모듈의 클래스용입니다.
- 확장 클래스 로더 플랫폼 클래스 로더로 이름이 변경되었습니다. . Java SE Platform의 모든 클래스는 플랫폼 클래스 로더를 통해 볼 수 있으며 Java SE 플랫폼의 일부가 아닌 Java 커뮤니티 프로세스 아래 모듈의 클래스도 플랫폼 클래스 로더를 통해 볼 수 있습니다.
- 응용 프로그램 Java SE Platform의 일부 클래스의 플랫폼 클래스가 플랫폼 클래스 로더에 의해 정의되는 반면 다른 것들은 부트스트랩 클래스 로더에 의해 정의되는 클래스 로더에 의존할 수 없습니다. .
- 기존 코드에서 부트스트랩 클래스 로더를 부모 클래스 로더로 사용하여 클래스 로더를 생성했다면 플랫폼 클래스 로더를 부모로 사용하도록 변경해야 합니다.
- 플랫폼 클래스 로더 URLClassLoader의 인스턴스가 아닙니다. , 오히려 내부 클래스입니다.
- 부트스트랩 클래스 로더 내장 클래스 로더입니다. JVM의. 그러나 base와 같은 중요한 모듈의 클래스를 정의합니다. . -Xbootclasspath/a로 배포된 애플리케이션 또는 null 을 사용하여 클래스 로더를 만듭니다. 부모 로서 변경해야 할 수도 있습니다.
예
public class ClassLoaderTest {
public static void main(String args[]) {
System.out.println("Class Loader Test");
ClassLoaderTest test = new ClassLoaderTest();
try {
test.showClassLoaders();
} catch(ClassNotFoundException cnfe) {
System.out.println(cnfe.getMessage());
}
}
public void showClassLoaders() throws ClassNotFoundException {
System.out.println("Classloader of this class: " + ClassLoaderTest.class.getClassLoader());
System.out.println("Classloader of Permission: " + java.sql.SQLPermission.class.getClassLoader());
System.out.println("Classloader of LinkedList: " + java.util.LinkedList.class.getClassLoader());
return;
}
} 출력
Class Loader Test Classloader of this class: jdk.internal.loader.ClassLoaders$AppClassLoader@504bae78 Classloader of Permission: jdk.internal.loader.ClassLoaders$PlatformClassLoader@299a06ac Classloader of LinkedList: null