Java类加载过程
2016-07-23 14:41:02 0 举报
Java类加载过程是Java运行时系统的一项核心功能,它负责将Java字节码文件(.class文件)加载到内存中,并转换为Java虚拟机可以执行的方法和数据结构。这个过程主要包括五个步骤:加载、验证、准备、解析和初始化。加载阶段,Java类加载器将.class文件的二进制数据读入内存;验证阶段,确保.class文件的字节流符合Java语言规范;准备阶段,为类的静态变量分配内存,并将其初始值设为默认值;解析阶段,将符号引用转换为直接引用;初始化阶段,对类的静态变量赋予正确的初始值。
作者其他创作
大纲/内容
Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader
最后由AppClass Loader加载HelloWorld类
解析是对类的字段,方法等东西进行转换,具体涉及到Class文件的格式内容
子类调用父类的静态变量
实际过程
几种被动引用类的情况
通过数组引用类的情况如:list = Main[10];
这一步只会给那些静态变量设置一个初始的值,而那些实例变量是在实例化对象时进行分配的,如:public static int i= 123; //此时i为0,因为还没有执行程序代码,只是初始化
背后的过程
未被加载的Java文件
类加载过程
先编译
五大初始化类的条件一、遇到new、getstatic、putstatic、invokestatic这4条字节码指令时二、使用java.lang.reflect.*的方法对类进行反射调用三、初始化子类,而它的父类没有初始化时,需要先初始化其父类四、JVM启动时初始化要求的主类(有static void main(String[] args)的类)五、用Class.forName(String className) 加载类时
注意:ClassLoader的loadClass(String className);方法只会加载并编译某类,并不会对其执行初始化
开始判断以下初始化条件
加载
类不会被初始化
原理
五种对类的主动引用
子类不会被初始化父类不会调用构造方法
准备
卸载
编译:.java - .class
满足上诉初始化条件
Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader
初始化(使用前的准备)
接口初始化 的时候编译器仍然会给接口生成一个()的类构造器,用来初始化接口中的成员变量,这点在类的初始化上也有做到。和类初始化的区别是:类需要考虑父类,而接口不用顾虑父接口
JVM做三件事:1. 通过一个类的全限定名来获取此类的二进制字节流2. 将这个字节流代表的静态存储结构转化为方法区的运行时数据结构3. 在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。
具体:①new实例化一个类②读取/设置静态字段注意:不包括final修饰的静态字段【这些字段已经被放入常量池】③执行静态方法
真正执行java里面的代码.就是执行程序的();方法的过程
产生一个Bootstrap Loader(启动类加载器)
概念
类已经进行了初始化?
寻找jre目录,寻找jvm.dll,并初始化JVM
调用类中的final静态常量
验证
JVM负责
运行:将.class文件加载到内存中,形成一个Class的对象
类的加载过程步骤原理
链接
()方法叫做类构造器方法,有编译器自动手机类中的所有类变量的赋值动作和静态语句块中的语句合并而成的,置于他们的顺序与在源文件中排列的一样
否
然后
解析
类Main不会被初始化
ClassLoader加载类
目的:确保class文件的字节流信息符合jvm的口味,不会让jvm感到不舒服。验证分为:文件格式验证-元数据验证-字节码验证-符号引用验证
使用
收藏
收藏
0 条评论
下一页
为你推荐
查看更多