[英]Which classloader loades Array class in Java?
以下代码打印 4 arrays 的类加载器。
我的问题是:
null
意思一样吗?/**
* output:
* null
* sun.misc.Launcher$AppClassLoader@18b4aac2
* null
* null
*/
public class Test {
public static void main(String[] args) {
String[] strings = new String[2];
System.out.println(strings.getClass().getClassLoader()); // ①
Test[] tests = new Test[2];
System.out.println(tests.getClass().getClassLoader()); // ②
int[] ints = new int[2];
System.out.println(ints.getClass().getClassLoader()); // ③
Integer[] integers = new Integer[2];
System.out.println(integers.getClass().getClassLoader()); // ④
}
}
Null 在这里代表引导程序 class 加载程序。 看:
https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getClassLoader
使用引导 class 加载程序加载核心 JDK 类的最小子集,表示为null
。
然后使用AppClassLoader
加载其他类。 有关更多信息,请查看此答案。
Test[] tests = new Test[2];
这是您自己的 class。 它由Launcher$AppClassLoader
加载。
但是其他的,它们属于java.lang.*
package。 它们由bootstrapClassLoader
加载。
System.out.println(System.getProperty("sun.boot.class.path"));
你可以试试; 它可以通过BootStrapClassLoader
获取所有路径。
类加载器的主要目的是为 class 返回 class 加载器,它将类动态加载到 memory 中。
现在,回答您的问题是:
Null
表示此 class 由引导程序 class 加载程序加载,这意味着a primitive type or void
。 引导类加载器是一种机器代码,当JVM 调用它时,它会启动操作。 它不是 java class。 它的工作是加载第一个纯 Java ClassLoader 。 Bootstrap ClassLoader 从位置 rt.jar 加载类。 Bootstrap ClassLoader 没有任何父 ClassLoader。 它也被称为原始类加载器。 在阅读 JVM 规范和ClassLoader.java 的文档后,我找到了答案。
output null
有不同的含义。
null
表示boostrap class 装载机null
表示没有 class 装载机null
表示boostrap class 装载机来自ClassLoader.java 的文档:
数组类的 Class 对象不是由 class 加载器创建的,而是根据 Java 运行时的要求自动创建的。 由 Class.getClassLoader() 返回的数组 class 的 class 加载器与其元素的 ZA2F2ED4F8DC40AB14DC21A2 类型相同; 如果元素类型是原始类型,则数组 class 没有 class 加载器。
从JVM 规范 5.3 开始:
如果 C 不是数组 class,则它是通过使用 ZA2F2ED4F2ED4F8EBC2C1DBB4C2 加载器加载 C 的二进制表示来创建的。 数组类没有外部二进制表示; 它们是由 Java 虚拟机而不是由 class 加载程序创建的。
- 如果组件类型是引用类型,则使用 class 加载程序 L 递归应用本节的算法,以加载并创建 C 的组件类型。
- Java 虚拟机创建一个新数组 class 并具有指定的组件类型和维数。
如果组件类型是引用类型,则 C 被标记为已由组件类型的定义 class 加载程序定义。 否则, C 被标记为已由引导程序 class 加载程序定义。
在任何情况下,Java 虚拟机都会记录 L 是 C 的初始加载程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.