ClassLoader

引导类加载器 BootstrapClassloader

C/C++实现,我们并不能获取到 加载Java核心class 如 rt.jar包中的内容。

扩展类加载器 ExtClassloader

继承了ClassLoader 用户加载java的扩展包下的内容 ext下面的jar包。

系统类加载器 AppClassloader

加载我们自己写的类。

如何自定义类加载器

  • 继承ClassLoader类重写oadClass 这个函数 会直接返回Class 类型
  • 继承ClassLoader类重写findLoadedClass

    双亲委派,如何打破 为什么要打破

类的加载过程

https://blog.csdn.net/xuemengrui12/article/details/82707473 可以参考一下

加载

  • 把类的.class文件加载到内存
  • 把静态存储结构(不知道具体是啥)转化为方法区的运行数据结构
  • 创建class对象

    连接

  • 验证

    • 反正就是各种验证,目前不太明白
  • 准备
    • 对类变量(静态变量)进行初始化的操作,这里会把所有的静态变量设置为该数据类型的0值
  • 解析
    • 符号引用替换为直接引用的过程

      初始化

      初始化阶段是执行类构造器()方法的过程。
      该函数是静态变量和静态代码块的集合的函数 在执行这个函数之前会去加载父类
      父类也会进行上面的加载、连接、初始化、然后执行父类的() 方法。这就是为什么父类的静态代码块会先执行,然后是子类的静态代码块的原因。所以JVM最先初始化的总是java.lang.Object类。

Class文件的结构

这里看吧,自己写没必要了
https://blog.csdn.net/lzy_zhi_yuan/article/details/104528820

https://www.cnblogs.com/luozhiyun/p/10546608.html