Java 9 中类加载器的变化是什么?


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

Java 9 中类加载器有一些细微的变化

  • **系统类加载器** 在 Java 9 中不再存在,它不再是 **URLClassLoader** 的实例,而是一个内部类。它是模块中类的 **默认加载器**。
  • **扩展类加载器** 已重命名为 **平台类加载器**。所有 Java SE 平台中的类都可以通过平台类加载器访问,Java 社区进程下的模块中的类(但不是 Java SE 平台的一部分)也可以通过平台类加载器访问。
  • **应用程序** 不能依赖于定义某些 Java SE 平台类所在的类加载器,其中一些类由平台类加载器定义,而另一些类由 **引导类加载器** 定义。
  • 如果现有代码创建的类加载器以引导类加载器作为父类加载器,则需要更改为使用平台类加载器作为父类加载器。
  • **平台类加载器** 不是 **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

更新于:2020年4月29日

777 次浏览

启动你的 职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.