定义
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
常用API
1 获取类对象
1.1 Class.forName
当知道该类的名称时,可以使用该方法获取类对象。
Class c = Class.forName(包名.类名);
1.2 .class
如果编写代码时,知道类的名称且类已存在,可以通过该方法获取类对象。
Class c = 包名.类名.class;
1.3 getClass()
如果拥有类的对象,可以通过该方法获取类对象。
Class c = 对象.getClass();
2 获取对象
1. 获取Constructor 对象
// 获取无参构造方法
Constructor cons = c.getConstructor();
// 获取含参构造方法;parameterTypes:参数类型的class对象数组
Constructor cons = c.getConstructor(parameterTypes);
2. 调用newInstance() 方法
// initargs:初始化参数,其顺序必须匹配构造方法中形参列表
Object obj = cons.newInstance(Object... initargs);
3 获取方法
// 根据参数列表的类型(类名.class)和方法名,得到一个方法(public修饰的) 。
Method m = c.getMethod(String methodName , parameterTypes)
// 得到一个类的所有方法 (public修饰的) 。
Method[] ms = c.getMethods();
4 执行方法
// obj:调用方法的对象; args:传递的参数列表
Object result = invoke(Object obj, Object... args)
5 项目示例
···
// 通过反射创建配置文件中各个类
Class c = Class.forName(className);
// 创建类的对象
Object obj = c.getConstructor().newInstance();
// 获取类的所有方法
Method[] methods = c.getMethods();
···
Object result = null;
try {
// 执行方法
result = method.invoke(obj,req,resp);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
···