一、前言
关于class文件的接口,这里不做分享,简单描述一下,class文件是一些二进制字符组成的字符文件,主要有文件头(OXCoffeebaby)、文件内容组成,包括我们的知道的一些约束条件,例如是否private、public等属性,以及数据类型等。当class文件+指令集(在jvm栈里面存储)就可以执行一次操作,如果有错误欢迎指正。以上就是对class文件的简单描述,接下来将会分享一些类加载的过程。
二、类加载过程
1.1 初始化
对于什么时间进行初始化jvm没有做具体要求,但是对于初始化有如下要求,加载、验证、准备自然需要在此之前。
*1、进行new、getstatic、putstatic、invokStatic时候
需要加载步骤(创建变量、静态方法调用)
2、反射时候,使用reflect类时候
3、初始化父类
4、main()入口类
5、MethodHandle解析结果为上诉1情况时候
*
1.2加载
1、通过全限定名订单二进制流
2、将二进制流转换为方法区的运行时数据结构
3、在内存中生成一个java.lang.class的对象,作为访问入口。
1.3验证
1、文件格式的验证
2、元数据验证-类特性等等
3、字节码验证
4、符号引用的验证
1.4准备
正式类变量分配内存与初始值复制0.static例外,可以直接在准备阶段赋值。
1.5解析
将常量池的符号引用换为直接引用。
类接口解析:
A、非数组,全限定名解析,类加载器去加载,还可以出发父类加载等。
B、数据,数组解析,生成数组对象。
C、符号引用验证,是否有权限。
三、双亲委派模型
双亲委派模式:一个类收到类加载请求,不会自己尝试加载,而是委派给父亲去加载,只有当父亲无法完成加载,子加载器才会自己加载。(意思就是基础的东西他全部都有了,我们只要加载它作为基础)
双全委派破坏3·1·
1、JNDI标准服务,通过线程上下文加载器,通过Thread设置。
2、OSGI服务颠覆了类加载的委派方式。