Class 类
约 483 字大约 2 分钟
2024-08-10
class 是由JVM在执行过程中动态加载的。JVM 在第一次读取到一种 class 类型时,将其加载进内存
每加载一种 class,JVM 就为其创建一个 Class 类型的实例,并关联起来。这里的 Class 类型是一个名叫 Class 的 class
public final class Class {
private Class() {}
}反射
由于 JVM 为每个加载的 class 创建了对应的 Class 实例,并在实例中保存了该 class 的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个 Class 实例,我们就可以通过这个 Class 实例获取到该实例对应的class的所有信息。
这种通过 Class 实例获取 class 信息的方法称为反射(Reflection)
获取Class实例
方法一:直接通过一个 class 的静态变量 class 获取
Class cls = String.class;方法二:如果我们有一个实例变量,可以通过该实例变量提供的 getClass() 方法获取
String str = "hello";
Class cls = str.getClass();方法三:如果知道一个 class 的完整类名,可以通过静态方法 Class.forName() 获取
public static void main(String[] args) throws ClassNotFoundException {
Class cls = Class.forName("java.lang.String");
}比较
注意一下 Class 实例比较和 instanceof 的差别
Integer n = new Integer(123);
boolean b1 = n instanceof Integer; // true,因为n是Integer类型
boolean b2 = n instanceof Number; // true,因为n是Number类型的子类
boolean b3 = n.getClass() == Integer.class; // true,因为n.getClass()返回Integer.class
boolean b4 = n.getClass() == Number.class; // false,因为Integer.class!=Number.class用 instanceof 不但匹配指定类型,还匹配指定类型的子类。而用 == 判断 class 实例可以精确地判断数据类型,但不能作子类型比较
动态加载
JVM 在执行Java程序的时候,并不是一次性把所有用到的 class 全部加载到内存,而是第一次需要用到 class 时才加载