类的加载

来源:互联网 发布:大数据时代读书笔记 编辑:程序博客网 时间:2024/05/29 04:10
类的加载:
类的整个生命周期:
加载-->连接(验证-->准备-->解析)-->初始化-->使用-->卸载
其中解析和初始化的顺序不确定。
1. 加载:把类的.class文件中的数据读取到内存,通常是创建一个字节数组读入。然后产生与所加载类对应的class对象。此时class对象还不完整,类还不可用。具体过程是:
(1)通过一个类的全限定名来获得定义此类的二进制字节流;
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
(3)在内存中生成一个此类的class对象,作为方法区中这个类的各种数据的访问入口。
其他情况:
数组类本身不通过类加载器创建,而是由java虚拟机直接创建。
2. 验证,主要有4个阶段的检验动作:
(1)文件格式验证:验证字节流是否符合Class文件格式规范,是否能被当前JVM处理等。如常量池中的常量类型、索引指向的常量是否存在或类型符合、class文件是否有其他信息……;
(2)元数据验证:对字节码进行语义分析,是否符合java语言规范。如类是否有父类(除Object外都有),继承是否违规,实现类是否实现了父类的抽象方法等……;
(3)字节码验证:通过数据流和控制流分析确定程序语义是否合法。
(4)符号引用验证。
3. 准备:为静态变量分配内存并设置默认值。
4. 解析:将常量池里的符号引用替换为直接引用。
(1)类或接口的解析
(2)字段解析
(3)类方法解析
(4)接口方法解析
5. 初始化:执行类构造器<clinit>()方法的过程。
简要为:
(1)如果类存在直接的父类则先初始化父类;
(2)如果类中存在初始化语句,就依次执行。

类加载器:
1. 启动类加载器(根加载器)(Bootstrap)
2. 扩展类加载器(Extension)
3. 应用程序类加载器(系统类加载器)(Application)
4. 用户自定义类加载器(java.lang.ClassLoader的子类)
双亲委派模型中类加载器的优先级从上往下,但并非是继承的方式实现,而是以组合的方式使用父加载器。当父类明确表示无法完成这个加载请求时,子类才会自己尝试加载。

补充:判断两个类是否相等,只有在两个类是被同一个类加载器加载的前提下才有意义。
原创粉丝点击