JAVA-类的加载过程

类加载分为三个部分:
1.加载
2.链接 可以细化为:验证、准备、解析
3.初始化

加载:
把class字节码文件通过类加载器装载入内存中
重点:
字节码来源:本地路径下编译的class文件,jar包中的class文件,通过网络远程获取的class文件,动态代理实时编译的class文件
类加载器:
启动类加载器(bootstrap ClassLoader):负责加载JAVA_HOME/lib目录下能被虚拟机识别的jar,名称必须是以java/javax开头的
扩展类加载器(Extension ClassLoader):该加载器可以被开发者使用
应用程序加载器(Application ClassLoader):系统类加载器,负责加载应用程序中的类,是应用程序的默认加载器

这里涉及到双亲委派模型:
一个类加载器收到类加载的请求,首先会将这个请求交给父加载器去加载,如果没有父加载器则选择启动类加载器去加载,如果这些加载器都不能加载,则使用自己的加载器去加载
优点:可以避免一个类被不同类加载器加载时出现多个类的混乱问题

验证:
文件格式验证、元数据验证、字节码验证、符号引用验证

准备:
为类变量分配内存并设置初始值,对于非常量初始化为默认值,比如 static int a=12,设置初始值为0.如果是常量,比如static final int a = 12,设置初始值为12

解析:
将符号引用替换为直接引用

初始化:
执行类构造器<clinit()>方法的过程,按程序制定的计划去初始化类变量和其他资源
触发初始化的几种情况:
1.通过new、get static、put static、invoke static指令,即:使用new关键字实例化对象、读取或设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用类的静态方法的时候
2.使用反射
3.初始化一个类的时候,如果其父类没有初始化,则会初始化其父类
4.jvm启动时,用户指定的执行主类,jvm会先初始化这个类


猜你喜欢

转载自blog.csdn.net/ignorewho/article/details/80438694