Java 9中的类加载器有哪些变化?

所有Java程序都在Java虚拟机(JVM)上运行。编译后,将Java类转换为平台 和与机器无关的字节码,并将编译后的类存储为.class文件。每当我们尝试使用它时,ClassLoader都会 将该类加载到内存中。当按名称引用这些类时,这些类将引入Java环境中。一旦类开始运行,就由类加载器完成类的加载,并且main()方法是启动该类的一种方法。

Java 9中的类加载器几乎没有什么变化:

  • 系统类加载器是没有更多的在Java中9,实例URLClassLoader的, 而它是一个内部类。它是模块中类的默认加载器

  • 扩展类加载器已经改名为一个平台的类加载器。通过平台类加载器可以看到Java SE Platform中的所有类,也可以通过平台类加载器看到Java社区进程下模块中的类,但不是Java SE平台的一部分。

  • 应用程序 不能依赖于定义Java SE Platform中某些类的平台类由平台类加载器定义,而其他bootstrap类加载器定义的类加载器

  • 如果现有代码使用引导类加载器作为父类加载器创建了一个类加载器,那么我们需要更改为使用平台类加载器作为父类加载器。

  • 平台的类加载器不是一个实例URLClassLoader的,而它是一个内部类。

  • 引导类加载器是一个内置的类加载器的JVM。但是,它定义了诸如base之类的关键模块的类。部署了应用程序- Xbootclasspath / A或创建一个类加载器与空 家长 可能需要改变。

示例

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