系列文章目录
类加载的过程,反射机制
目录
一、JVM结构
JVM负责解释和执行字节码文件,同时还有内存管理,垃圾回收的功能
类加载器:类加载器负责加载Java字节码文件(.class文件), 并将其转换为可执行的代码。它将类加载到JVM的运行时数据区域中,并解析类的依赖关系。
运行时数据区:方法区,堆,栈,本地方法栈,程序计数器(用于存储当前线程执行的字节码指令的地址)
执行引擎:负责执行编译后的字节码指令,将其转换为机器码执行,包括解释器和即时编译器(JIT)
垃圾回收器:负责回收堆内存中不再使用的对象。
本地方法接口:允许Java程序调用本地方法
解释器(interpreter):
class文件内容,需要交给JVM进行解释执行,简单理解就是JVM解释一行就 执行一行代码。所以如果Java代码全是这样的运行方式的话,效率会稍低一 些
即时编译器(JIT:Just In Time):
执行代码的另一种方式,JVM可以把Java中的 热点代码直接编译成计算机可 以运行的二进制指令,这样后续再调用这个热点代码的时候,就可以直接运 行编译好的指令,大大提高运行效率。
二、类加载
1.类加载的时机
当第一次使用到某个类的时候,该类的class文件会被加载到方法区
使用java命令来运行某个主类
创建类的实例对象
调用类的static方法,访问类或接口的static成员,或为该类的static成员赋值
初始化某个类,其父类也会被自动加载
使用反射获取字节码对象,也会加载
2.类加载的过程
一个类的生命周期:加载,链接,初始化,使用,卸载
加载:
将类的字节码文件加载到内存方法区中。这个阶段由类加载器完成,类加载器根据类的全限定名来定位并读取类的字节码文件,然后将字节码转换为JVM内部 的数据结构
链接:
验证:验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证等, 以确保字节码的安全性和正确性。
准备:为类的 static静态变量分配内存,并设置默认初始值。
这个阶段会在方法区中为类的静态变量分配内存空间,并设置默认初始值 (如0、0.0、null等),但不会执行静态变量的初始化代码。
解析:将类的符号引用解析为直接引用。
在解析阶段,将符号引用(如类名、方法名、字段名)转换为直接引用(如 直接指向方法、字段的指针或偏移量),以便于后续的访问和调用。
初始化:
对类进行初始化,包括执行静态变量的赋值和静态代码块的初始化。 在此阶段,会按照程序的顺序执行类的静态变量赋值和静态代码块中的初始化代码,完成类的初始化工作。
3.加载器分类
BootStrap ClassLoader:根类加载器
负责加载Java核心类库,例如rt.jar包
Extension ClassLoader:扩展类加载器
System ClassLoader:系统类加载器
负责加载应用程序的类,包括自定义类和第三方类库等,系统类加载器的搜索路径包括当前工作目录和CLASSPATH环境变量指定的路径
User ClassLoader:自定义加载器
4.双亲委托机制
我理解的双亲委托机制:
当需要加载一个类时,先看系统加载器是否加载过这个类,如果加载过那就不需要加载了,如果没有加载过,拿到父类加载器继续判断,直到根类加载器,如果根类加载器也没有加载过,那就去判断是否能加载这个类,如果能就加载,如果不能就向下也就是看子类能不能加载,最后如果都不能加载抛出ClassNotFoundException异常
5.常用方法
public static ClassLoader getSystemClassLoader() :获取系统类加载器
public InputStream getResourceAsStream(String name): 加载某一个 资源文件,注意是相对路径
三、反射
反射的核心类:Class、Constructor、Filed、Method表示类的不同部分的关键类
1.反射机制的作用
反射机制是在Java程序运行的状态下,动态的获取、检查和操作类的信息和对象的能力
对于任意一个类,都能够知道这个类的所有属性和方法
对于任意一个对象,都能调用它的任意一个方法和属性
2.字节码对象
一个类的字节码对象只有一个。
对于基本数据类型获得字节码对象:数据类型.class
对于数组的获取方式:数组.class,数组名.getClass()
使用类的字面量:类名.class
Object类中的方法:对象.getClass()
public final native Class<?> getClass()
借助Class类的方法:Class.forName(“类的全包名”);
public static Class<?> forName(String className);