8、类加载机制

类加载机制

一、类的生命周期 

二、5种情况必须对类进行“初始化”

1、new 对象

2、反射的时候

3、父类没有初始化的时候,需要先初始化父类

4、Main入口,需要初始化这个类

5、代理invoke时

三、类加载全过程(加载-验证-准备-解析-初始化)

加载:

  1、获取class文件的二进制流;

  2、根据class的格式化数据结构,在方法区生成运行时的数据结构;

  3、生成class对象,作为方法区的入口;

   

验证:

  1、验证文件格式,如开头是否时CAFEBABE(这个魔头实在太好记了)

  

准备:

  1、为statics 等字段在方法区分配空间,并设置初值。0 null 之类的;

 

分配空间,并设置初值。0 null 之类的

解析:

  1、解析继承class和interface

  2、解析字段feild

  3、类方法解析

  4、接口方法解析

初始化:

  

双亲委派模型:

  bootstrap ClassLoader:加载lib目录下面的class;

  EXT ClassLoader:扩展类加载器;加载lib/ext目录下面的class;

  APP ClassLoader:应用加载器,加载claapath目录下面的class;

双亲委派模型要求每个类加载器都有个parent

 这样任意一个类都会由上而下确定唯一的加载器;从而确认唯一的类;

双亲委派的弊端与破坏

破坏一:历史原因,jdk1.0之前已经由类加载器,而双亲委派是在1.2以后出现的;

破坏二:启动类需用应用到非基础类,而这些非基础类需要其他类加载器去加载;使用线程上下文线程去调用类加载器加载这些非基础类

破坏三:由于用户对热更新,热部署的要求;

原文地址:https://www.cnblogs.com/yeyongjian/p/9253035.html