反射回顾

130 阅读1分钟

定义

  反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

常用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();
    }
    ···