Java 反射是 Java 语言的一种重要特性,它提供了在运行时(runtime)检查、获取和操作 Java 类的能力。更具体地说,反射可以让我们:
在运行时获取类的元数据信息,如类名、方法的参数以及返回类型等信息。
在运行时获取类的对象,并通过反射调用它的方法。
动态地创建 Java 对象,而不需要在编译时提前知道对象的类型。
反射 API 位于 java.lang.reflect 包中,主要包括以下几个类:
Class 类:它是 Java 中所有类的基础类,表示一个 Java 类的元数据信息。
Constructor 类:它表示一个类的构造函数。
Field 类:它表示一个类的成员变量。
Method 类:它表示一个类的方法。
使用反射 API 的基本步骤如下:
获取类的 Class 对象实例,即通过类名获取 Class 对象。例如,可以使用以下语句获取 String 类的 Class 对象:
Class<?> clazz = String.class;
创建需要操作的实例。可以使用 Class.newInstance() 方法创建对象实例,或者使用 Constructor.newInstance() 方法创建新对象。例如,可以使用以下语句创建一个 String 对象的实例:
String str = (String) clazz.newInstance();
获取需要操作的属性或方法的 Field 或者 Method 对象。可以使用 Class.getField() 或者 getDeclaredField() 方法获取字段对象,使用 Class.getMethod() 或者 getDeclaredMethod() 方法获取方法对象。例如,以下语句可以获取 String 类的 getValue() 方法对象:
Method getValueMethod = clazz.getMethod("getValue");
使用 Field 或者 Method 对象操作对应的属性或方法,如读写字段的值,调用方法等。例如,使用以下语句调用 String 类中的 getValue() 方法,并获取返回值:
Object value = getValueMethod.invoke(str);
需要注意的是,反射的使用可能会对性能产生一定的影响,因为使用反射的代码在运行时才会动态地获取类的信息,并在运行时才进行方法调用和属性操作。因此,如果可能,更好的方式是在编译时就确定需要使用的类和方法。