繁体   English   中英

哪个类加载器在 Java 中加载数组 class?

[英]Which classloader loades Array class in Java?

以下代码打印 4 arrays 的类加载器。
我的问题是:

  1. 为什么数组的类加载器不同?
  2. output 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 中。

现在,回答您的问题是:

  1. 为什么数组的类加载器不一样?
    Ans:因为它被不同的类加载器调用,并不是所有的类都被单个 ClassLoader 加载
  2. output null 意思一样吗?
    回答: 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 的null表示boostrap class 装载机
  • ③ null 的null表示没有 class 装载机
  • ④ null 的null表示boostrap class 装载机

来自ClassLoader.java 的文档
数组类的 Class 对象不是由 class 加载器创建的,而是根据 Java 运行时的要求自动创建的。 由 Class.getClassLoader() 返回的数组 class 的 class 加载器与其元素的 ZA2F2ED4F8DC40AB14DC21A2 类型相同; 如果元素类型是原始类型,则数组 class 没有 class 加载器

JVM 规范 5.3 开始
如果 C 不是数组 class,则它是通过使用 ZA2F2ED4F2ED4F8EBC2C1DBB4C2 加载器加载 C 的二进制表示来创建的。 数组类没有外部二进制表示; 它们是由 Java 虚拟机而不是由 class 加载程序创建的

JVM 规范 5.3.3 开始

  1. 如果组件类型是引用类型,则使用 class 加载程序 L 递归应用本节的算法,以加载并创建 C 的组件类型。
  2. Java 虚拟机创建一个新数组 class 并具有指定的组件类型和维数。
    如果组件类型是引用类型,则 C 被标记为已由组件类型的定义 class 加载程序定义。 否则, C 被标记为已由引导程序 class 加载程序定义
    在任何情况下,Java 虚拟机都会记录 L 是 C 的初始加载程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM