Class类介绍

Class类是存在于JDK中的java.lang包下的类。Class是一个保存着运行时类所有信息的类,即在程序运行时跟踪类且掌握着类的全部信息,故其也被称为反射的源头。Class类没有公共的构造方法,Class对象是在类加载的时候由JVM通过调用类加载器中的 defineClass 方法自动构造的,也就是说只有JVM能创建Class对象,我们自己的Java程序是无法创建Class对象的。

Class类的Class对象

Class类被创建后的对象就是Class对象,Class对象表示的是自己手动编写类的类型信息,比如创建一个People类,那么JVM就会创建一个People类对应的Class对象,该Class对象保存了People类相关的类型信息。实际上在Java中每个类都有一个Class对象,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里,.class也被称为字节码文件(这里的Class对象与下面jvm加载的Class对象不一样,这里的Class对象是被JVM加载生成Class对象前,存储在二进制格式的.class字节码文件中的Class对象,在这里可能有点绕,但是要区分这个存储在.class文件中的Class对象和在JVM中加载的Class对象);需要特别注意的是,手动编写的每个class类,无论创建多少个实例对象,在JVM中都只有一个Class对象,即在内存中每个类不管有多少个实例对象,这些同一个类的实例对象有且只有一个相对应的Class对象。

JVM加载Class对象

在程序运行的时候,如果实例化了一个自定义的类或者使用自定义类的静态方法时,如上面举的People类,JVM会在内存中查询是否加载了People类对应的Class对象,若是没有被加载,那么JVM会从People类的.class文件下找People类对应的Class对象,然后把该Class对象加载到内存中,加载到内存中的Class对象包含了People类的很多信息,比如属性/方法/修饰符/构造器/类名等等。在.class文件中加载Class对象时,还会对.class文件中的字节流包含的信息进行验证,验证它的完整性,确保它没有被破坏,以及它不包含不良的java代码。最后验证成功后,该People类的Class对象加载完成,我们可以用该Class类创建上述People类的实例对象,并且被创建的People实例对象和该Class对象形成关联。


获得Class对象的3种方法

  1. 类.Class
  2. 类的实例对象.getClass()
  3. Class.forname(类的全限定名)

上述三种方法都可获得某个类的Class对象。

Class对象的一些常用方法

方法名

说明

forName(String className)

返回与带有给定字符串名的类或接口相关联的 Class 对象。

getClassLoader()

返回该类的类加载器。

getDeclaredFields()

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

getDeclaredMethods()

返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

isAnnotationPresent(Class<? extends Annotation> annotationClass)

如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。