Java 反射 API

2024 年 8 月 29 日 | 4 分钟阅读

Java 反射是 在运行时检查或修改类的运行时行为的过程

java.lang.Class 类提供了许多方法,可用于获取元数据、检查和更改类的运行时行为。

java.lang 和 java.lang.reflect 包提供了用于 Java 反射的类。

使用场景

反射 API 主要用于

  • IDE(集成开发环境),例如 Eclipse、MyEclipse、NetBeans 等。
  • 调试器
  • 测试工具等。
你知道吗?
  • 有几种方法可以获取 Class 类的实例?
  • 如何创建 javap 工具?
  • 如何创建 appletviewer 工具?
  • 如何从类外部访问私有方法?

java.lang.Class 类

java.lang.Class 类主要执行两个任务

  • 提供方法在运行时获取类的元数据。
  • 提供方法来检查和更改类的运行时行为。

Class 类的常用方法

方法描述
1) public String getName()返回类名
2) public static Class forName(String className)throws ClassNotFoundException加载类并返回 Class 类的引用。
3) public Object newInstance()throws InstantiationException,IllegalAccessException创建新实例。
4) public boolean isInterface()检查它是否是接口。
5) public boolean isArray()检查它是否是数组。
6) public boolean isPrimitive()检查它是否是基本类型。
7) public Class getSuperclass()返回超类引用。
8) public Field[] getDeclaredFields()throws SecurityException返回此类的字段总数。
9) public Method[] getDeclaredMethods()throws SecurityException返回此类的方法总数。
10) public Constructor[] getDeclaredConstructors()throws SecurityException返回此类的构造函数总数。
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException返回方法类实例。

如何获取 Class 类的对象?

有 3 种方法可以获取 Class 类的实例。它们如下:

  • Class 类的 forName() 方法
  • Object 类的 getClass() 方法
  • .class 语法

1) Class 类的 forName() 方法

  • 用于动态加载类。
  • 返回 Class 类的实例。
  • 如果您知道类的完全限定名,则应使用此方法。此方法不能用于基本类型。

让我们看一个 forName() 方法的简单示例。

文件名: Test.java

输出

Simple

2) Object 类的 getClass() 方法

它返回 Class 类的实例。如果您知道类型,则应使用它。此外,它也可以用于基本类型。

文件名: Test.java

输出

Simple

3) .class 语法

如果存在某种类型但没有实例,则可以通过在类型名称后附加“.class”来获取 Class 对象。它也可以用于基本数据类型。

文件名: Test.java

输出

       boolean
       Test

确定类对象

Class 类的以下方法用于确定类对象

1) public boolean isInterface(): 确定指定的 Class 对象是否表示接口类型。

2) public boolean isArray(): 确定此 Class 对象是否表示数组类。

3) public boolean isPrimitive(): 确定指定的 Class 对象是否表示基本类型。

让我们看一个反射 API 的简单示例来确定对象类型。

文件名: Test.java

输出

 false
 true

反射的优缺点

Java 反射应始终谨慎使用。虽然反射提供了很多优点,但它也有一些缺点。让我们先讨论优点。

优点: 使用反射可以在运行时检查接口、类、方法和字段,即使在编译时没有使用它们的名称。还可以使用反射调用方法、实例化一个类或设置字段的值。它有助于创建可视化开发环境和类浏览器,为开发人员编写正确的代码提供帮助。

缺点: 使用反射可以打破封装原则。可以使用反射访问类的私有方法和字段。因此,反射可能会将重要数据泄露到外部,这很危险。例如,如果有人访问类的私有成员并将其设置为 null 值,那么该类的其他用户可能会遇到 NullReferenceException,并且这种行为是意料之外的。

另一个缺点是性能开销。由于反射中的类型是动态解析的,因此 JVM(Java 虚拟机)优化无法进行。因此,反射执行的操作通常很慢。

结论

由于上述缺点,通常建议避免使用反射。它是一种高级功能,只有对语言基础知识有深入了解的程序员或开发人员才应使用。永远记住!每当使用反射时,应用程序的安全性就会受到影响。