Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java 9에서 클래스 로더의 변경 사항은 무엇입니까?

<시간/>

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