5. 先有鸡还是先有蛋

Posted duguxiaobiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5. 先有鸡还是先有蛋相关的知识,希望对你有一定的参考价值。

1. 引言

在之前的文章中,我们可以知道,不管我们项目中使用的类还是Jvm提供的jar包,都是由类加载器加载的,也就是说java类都是类加载器加载,但是不管是扩展类加载器还是系统类加载器,都是类ClassLoader的子类,他们又是谁加载的呢? 到底是先有的类加载器还是先加载类的呢?

2. 理论

  1. 内建于JVM中的启动类加载器会加载ClassLoader以及其他java平台类。
    当JVM启动时,启动类加载器将会运行,加载扩展类加载器,以及系统类加载器。

  2. 启动类不是Java类(C++编写),属于特定平台的机器指令,负责开启整个加载的过程

3. 验证

3.1 如何验证ClassLoader类是由启动类加载

暂时没看到博客有详细介绍 启动类加载器是怎么加载ClassLoader的,暂时通过理论启动类加载器加载的资源目录中存在ClassLoader所在jar包(rt包)来验证,然后使用一下demo测试

public static void main(String[] args) {
    System.out.println(ClassLoader.class.getClassLoader());
}

上述程序结果:

null

有上述理论分析,ClassLoader是由启动类加载的,所以其对应的类加载器应该是Bootstrap类加载,即应该返回null

3.2 如何验证扩展类加载器,系统类加载器也是由启动类加载器加载

查询源码可知,扩展类加载器和系统类加载器属于类Launcher中定义,外界访问不到,但是只要确定Launcher类是由启动类加载器加载,就会导致Launcher中的静态应用以及其所有的内部类都会被其加载,也就能证明系统类和系统类加载器被加载。

public static void main(String[] args) {
    System.out.println(Launcher.class.getClassLoader());
}

上述程序结果:

null

有上述理论分析,ClassLoader是由启动类加载的,所以其对应的类加载器应该是Bootstrap类加载,即应该返回null

4. 总结

其中的理论,暂时没有在网上早上相关的文档,只是看视频中老师是这样总结的。所以这里只是记录一下。

以上是关于5. 先有鸡还是先有蛋的主要内容,如果未能解决你的问题,请参考以下文章

用 C# 编写 C# 编译器,先有鸡还是先有蛋?

GWT RPC 序列化和循环引用——先有鸡还是先有蛋的问题

[Java]先有Class还是先有Object?

JS 究竟是先有鸡还是有蛋,Object与Function究竟谁出现的更早,Function算不算Function的实例等问题杂谈

1.4 面向对象的基本概念

YDKJS 作用域和闭包变量提升