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
时才加载