Java 9 中的类加载器有哪些变化?
javaobject oriented programmingprogramming更新于 2025/11/4 8:12:17
所有 Java 程序都在 Java 虚拟机 (JVM) 上运行。Java 类在编译后会转换为 平台 和 独立于机器的字节码,并且编译后的类会存储为 .class 文件。每当我们尝试使用它时,ClassLoader 都会将该类加载到内存中。当通过名称引用这些类时,它们就会被引入 Java 环境中。一旦类开始运行,类的加载就由类加载器完成,main() 方法是启动该类的一种方式。
Java 9 中的类加载器有一些细微的变化:
- Java 9 中不再有 系统类加载器,它是 URLClassLoader 的一个实例,而是一个内部类。它是模块中类的 默认加载器。
- 扩展类加载器已重命名为 平台类加载器。 Java SE 平台中的所有类都可以通过平台类加载器看到,Java 社区进程下模块中但不属于 Java SE 平台的类也可以通过平台类加载器看到。
- 应用程序不能依赖于定义在哪个平台类中的类加载器,Java SE 平台中的某些类由平台类加载器定义,而其他类则由引导类加载器定义。
- 如果现有代码以引导类加载器为父类加载器创建类加载器,则我们需要更改为使用平台类加载器作为父类加载器。
- 平台类加载器不是URLClassLoader的实例,而是内部类。
- 引导类加载器是 JVM 的内置类加载器。但是,它定义了关键模块的类,例如 base。使用 -Xbootclasspath/a 部署的应用程序或使用 null 作为 parent 创建类加载器的应用程序可能需要更改。
示例
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
相关文章
有用资源
java 参考教程 - 该教程包含有关 java 的更多信息:https://www.cainiaomax.com/java/

