通过反射查看类信息

Java程序许多对象运行时会出现两种类型:编译时类型、运行时类型。

例如Person p = new Student();,在编译时p变量是Person类型,运行时是Student类型。

但程序又需要调用该对象运行时类型的方法。

为了解决这个问题,程序需要在运行时发现对象和类的真实信息,有两种方法

  • 第一种是假设在编译和运行时都完全知道类型的具体信息,可以使用instanceof运算符进行判断,再利用强制类型转换,转换为运行时类型的变量。
  • 第二种是程序只能依靠运行时来发现该对象和类的真实信息,只能用反射。

获得Class对象

每个类被加载,系统都会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类,在Java程序中获得Class对象通常有三种方式。

  1. 使用Class类的forName(String className)静态方法,参数是某个类的全限定类名
  2. 调用某个类的class属性来获取该类对应Class对象
  3. 调用某个对象的getClass方法,该方法是Object类的一个方法,所有Java对象都可以调用。

对于第一种和第二种方法,都是直接根据类来获取Class对象。相比之下,第二种有两种优势。

  1. 代码更安全,程序在编译阶段就可以检查需要访问的Class对象是否存在
  2. 性能更好,无需调用方法

大部分时候,都应该使用第二种方法来获取类的Class对象。如果程序只能获得一个字符串"java…lang.String",只能使用第一种方式。

一旦获得某个类对象的Class对象之后,就可以调用方法来获取该对象和该类的真实信息了。

从Class中获取信息

Class对象有贼拉多的方法来获取信息。每个方法都可能包括重载的版本。


通过反射查看类信息
https://zhaoquaner.github.io/2022/05/11/Java/类加载机制和反射/3-通过反射查看类信息/
更新于
2022年5月22日
许可协议