Java反射机制API
Java反射机制API主要是java.lang.Class类和java.lang.reflect包。
java.lang.Class类
java.lang.Class类是实现反射的关键所在,Class类的一个实例表示Java的一种数据类型,包括类,接口,枚举,注解(annotation),数组,基本数据类型和void,void是“无类型”,主要用于方法返回值类型声明,表示不需要返回值。Class没有公有的构造方法,Class实例是是由JVM在类加载时自动创建的。
Class类提供了很多方法可以获得运行时对象的相关信息,下面的程序代码展示了其中的一些方法:
package java2023_08_10;
public class LangClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Class class1 = String.class;
String str = "Hello";
Class class2 = str.getClass();
Class class3 = int.class; //①
Class class4 = Integer.class; //②
System.out.println("class2类名称:" + class2);
System.out.println("class2是否为接口:" + class2.isInterface());
System.out.println("class2是否为数组对象:" + class2.isArray());
System.out.println("class2父类名称:" + class2.getSuperclass().getName());
System.out.println("class2是否为基本类型:" + class2.isPrimitive());
System.out.println("class3是否为基本类型:" + class3.isPrimitive());
System.out.println("class4是否为基本类型:" + class4.isPrimitive());
}
}
注意上面第①、②行的区别:int和Integer的区别在于int是基本数据类型,所以输出结果为true,Integer是类,是引用类型。
java.lang.reflect包
java.lang.reflect包提供了反射中用到的类,主要的类说明如下:
- Constructor类:提供类的构造方法信息。
- Field类:提供类或接口中成员变量信息。
- Method类:提供类或接口成员方法信息。
- Array类:提供了动态创建和访问java数组的方法。
- Modifier类:提供类和成员访问修饰符信息。
示例代码如下:
package java2023_08_10;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class LangReflect {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// 动态加载xx类的运行时对象
Class class1 = Class.forName("java.lang.String");
// 获取成员方法集合
Method[] method = class1.getDeclaredMethods();
// 遍历成员方法集合
for (Method m : method) {
// 打印权限修饰符
System.out.println(Modifier.toString(m.getModifiers()));
// 打印返回值类型名称
System.out.println(" " + m.getReturnType().getName() + " ");
// 打印方法名称
System.out.println(m.getName() + "();");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("找不到指定类");
}
}
}
反射(reflection)是程序的自我分析能力,通过反射可以确定类有哪些方法、哪些构造方法以及有哪些成员变量。Java语言提供了反射机制,通过反射能够动态读取一个类的信息;能够在运行时动态加载类,而不是在编译期。反射可以用于框架开发,它能够从配置文件中读取配置信息动态加载类,创建对象,以及调用方法和成员变量。