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
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP