类加载机制
一、类的生命周期
二、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以后出现的;
破坏二:启动类需用应用到非基础类,而这些非基础类需要其他类加载器去加载;使用线程上下文线程去调用类加载器加载这些非基础类
破坏三:由于用户对热更新,热部署的要求;