Class类的作用
Class类是一个特殊类,它用于表示JVM运行时类或接口的信息。
Class类提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。
在Java中枚举类是一种类,而注解是一个接口,数组也是一个类;Java原始类型(boolean, byte, char, short, int, long, float, and double)和关键字void也被表示为Class的对象。
你知道吗?
在每一个基本类型的包装类中都有一个共有的静态变量,例如Integer:
public static final Class TYPE = (Class) Class.getPrimitiveClass(“int”);
TYPE就是这个基本类型的Class对象表示。
一个类只有被JVM加载后才能使用,需要经过加载-->验证-->准备-->解析-->初始化
五个阶段。
当类被虚拟机加载后都会在内存中创建一个该类的Class对象,用于存储该类的各种信息。
Class类的构造函数被设计为私有的,这意味着我们不能通过new的方式来创建Class对象,只有JVM才能创建该类的实例。因为类的加载不是我们负责的,只有JVM才知道如何加载一个类。
Class类的父类
Class类是java中的一个类和其他非继承类一样,默认的父类也是Object。
可以使用下面的方式验证:
public class ClassParentTest {
public static void main(String[] args) {
boolean assignableFrom = Object.class.isAssignableFrom(Class.class);
System.out.println(assignableFrom);
}
}
Class#isAssignableFrom(Class<?> cls)
方法用于判断cls的实例能否赋值给该Class的引用;换句话说,该方法可以用来判断cls类是否是该Class的子类或者如果Class是接口表示cls是否实现了该接口。
上边那段代码将输出true
,说明Class类的父类是Object类。
Class类的forName方法
用于手动加载一个类,该方法是一个公共静态方法,有多个重载。
方法签名:
public static Class<?> forName(String className)
public static Class<?> forName(String name, boolean initialize,ClassLoader loader)
throws ClassNotFoundException
//下面这个是JDK9新增加的,用于从模块中加载一个类,不对类进行初始化
public static Class<