类的加载过程:
定义:虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
在java语言里,类型的加载,连接和初始化过程都是在程序运行期间完成的,这样虽然在类加载时会有一些性能开销,但是会为java应用程序提供高度的灵活性。java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。
类的生命周期:
加载:
就是将class文件读入内存,并位置创建一个Class对象。
任何类被使用时系统都会建立一个Class对象。
连接:
验证是否正确的内部结构,并和其他类协调一致
准备负责为类的静态成员分配内存,并设置默认的初始化值,
解析将类的二进制数据中的符号引用替换为直接引用
初始化:
就是创建一个类的实例。
类初始化时机:
创建类的实例,
访问类的静态变量,或者为静态变量赋值。
调用类的静态方法
使用反射方式强制创建某个类或者接口对应的java.lang.Class对象
初始化某个类的子类
直接使用java.exe命令来运行某个主类。
类加载器:
负责将class文件加载到内存中,并为之生存对应的Class对象。
虽然我们不需要关心类加载机制,但是了解这个机制我们就可以更好的理解程序的运行。
类加载器的组成
Bootstrap ClassLoader根加载器
Extension ClassLoader扩展类加载器
System ClassLoader 系统类加载器
Custom ClassLoader(用户自定义类加载器)
如图:
Bootstrap ClassLoader 根类加载器
也被称为引导类加载器,负责java核心类的加载。
比如System,String 等在jdk中的lib目录下rf.jar
Extension ClassLoader扩展类加载器
负责JRE的扩展目录中jar包加载
在jdk中jre的lib目录下的etx目录下
System ClassLoader系统加载器
负责在jvm启动时加载来自java命令的class文件、以及classpath环境变量所指定的jar包和类路径
站在这些class文件的角度,我们如何来使用这些class文件中内容呢?这就是反射要研究的内容。
--------------------------------------------------------------------引入深入jvm虚拟机内容