Java基础知识复习:类加载机制、反射和类初始化

需积分: 10 0 下载量 141 浏览量 更新于2024-09-01 收藏 7KB MD 举报
Java面试题复习第一弹 在 Java 中,反射机制是指在程序运行时动态地获取和操作类的信息的能力。获取到字节码有三种方法:使用 `Class.forName(className)` 方法,使用 `类名.class` 方法,使用 `this.getClass()` 方法。这些方法可以将字节码中的方法、变量、构造函数等映射成相应的 `Method`、`Field`、`Constructor` 等类,这些类提供了丰富的方法可以被我们使用。 类的初始化有多种触发方式,包括创建类的实例、new 一个对象、访问某个类或接口的静态变量、或者对该静态变量赋值、调用类的静态方法、反射、初始化一个类的子类(会首先初始化子类的父类)、JVM 启动时标明的启动类,即文件名和类名相同的那个类。 类的初始化步骤包括:如果这个类还没有被加载和链接,那就先进行加载和链接;如果这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口);如果类中存在初始化语句(如 static 变量和 static 代码块),那就依次执行这些初始化语句。 Java 的双亲委托机制是指类加载器之间的关系,子类加载器会将加载请求委托给父类加载器,如果父类加载器也不能加载,则继续委托给它的父类加载器,直到达到根加载器,最后如果都不能加载,则抛出 `ClassNotFoundException`。 JVM 加载 class 文件是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的运行时系统组件,它负责在运行时查找和装入类文件中的类。类的加载是指把类的 `.class` 文件中的数据读入到内存中,通常是创建一个字节数组读入 `.class` 文件,然后产生与所加载类对应的 `Class` 对象。加载完成后,`Class` 对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后 JVM 对类进行初始化,包括:如果类中存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;如果类中存在初始化语句,就依次执行这些初始化语句。 类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader 的子类)。BootStrap 负责加载 JVM 基础核心类库(rt.jar);Extension 从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 BootStrap。 本文涵盖了 Java 中的反射机制、类的初始化、双亲委托机制、类加载器、JVM 加载 class 文件等知识点,为 Java 开发者提供了有价值的参考资料。