모든 자바 프로그램은 자바 가상 머신(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