Java底层知识003-ClassLoader

2022/07/04 Interview

Java底层知识003-ClassLoader

目录

类从编译到执行的过程

举例:
1.编译器将Robot.java源文件编译为Robto.class字节码文件。
2.ClassLoader将字节码转换为JVM中的Class<Robot>对象。
3.JVM利用Class<Robot>对象实例化Robot对象。      

谈谈ClassLoader

1.主要工作在Class装载的加载阶段,主要作用从系统外部获得Class二进制数据流。
2.是jave核心组件,负责通过将Class文件里的二进制数据流装载进系统,然后交给java虚拟机进行
  连接、初始化等操作。

谈谈ClassLoader种类

说白了就是加载各自指定的目录下的class文件:
  1.BootStrapClassLoader:C++编写,加载核心库java.*
  2.ExtClassLoader:Java编写,加载扩展库javax.*
  3.AppClassLoader:java编写,加载程序所在目录
  4.用户自定义ClassLoader:java编写,定制话加载:
    findClass()、defindClass()

双亲委派机制

详情参考,博客另外一篇文章-类加载机制。

简单概括:
使用双亲委派模型来组织类加载器之间的关系,一个显而易见的好处就是Java中的类随着它的类
加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar之中,无论哪一
个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类
在程序的各种类加载器环境中都能够保证是同一个类。反之,如果没有使用双亲委派模型,都由各个
类加载器自行去加载的话,如果用户自己也编写了一个名为java.lang.Object的类,并放在程序的
ClassPath中,那系统中就会出现多个不同的Object类,Java类型体系中最基础的行为也就无从保证,应
用程序将会变得一片混乱。

类的加载方式

1.隐式加载:new
2.显示加载:loadClass,forName等

两者的区别:
  a.Class.forName得到的class是已经初始化完成的
  b.Classloder.loadClass得到的class是还没有链接的,某些情况下是不需要
    对类初始化的场景就会用到,例如:spring ioc 有懒加载机制,等真正要用的时候去初始化。

Search

    Table of Contents