什么是反射?
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。这是比较官方的解释
我们开发人员在使用开发工具编写代码时,就在使用反射机制,比如我们调用一个方法时,只需要声明一个类,然后点一下就可以看到该类中所有可使用的方法,这就是反射的一个应用。如果使用过Quartz这个定时框架的话,会发现这个框架也用了反射机制,反射在我们开发中使用的很多,就spring这个我们最常用的开发工具也大量使用了反射这个机制。比较通俗一些的说,就是在一定条件下给出相应的反应,就像敲击我们的膝盖小腿会弹起。
反射可以做什么呢?
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
我用反射做什么?
我在开发一个功能时,有一个信息解析功能,这个信息解析就是将接口收到的信息,按照不同的需求已不同的方式将信息拿出来,再以指定格式放入一个集合存储。但是这里有个问题,那就是这个信息解析很根据需求要增加新的解析方法,比如新加一个用于信息解析的的类,这个时候如果使用我们平时的开发方式,那么就需要添加新的代码,并更新项目,这样子并不方便新的信息解析模块的添加,而且在代码修改时如果发生错误,将会影响整个服务。
这个时候我想到了反射,,结合数据库解决这个问题,这样核心的代码没有大的需求变化基本就不在需要改动,只需要添加新的信息解析模块,然后在数据库中添加给模块的位置信息以及其他一些我们需要的信息就可以了。
反射使用,代码
用的的方法Class.forName()、getMethod()、newInstance()、invoke()
Class.forName() : 返回与给定字符串名称的类或接口相关联的 类对象
getMethod(): 获取该类指定方法
newInstance(): 类似new对象,实例化
invoke(): 调用类中方法,并传参
调用类:
public static void main(String[] args) {
try {
Map<String,Object> map=new HashMap<>();
Map<Object,Object> map1=new HashMap<>();
map.put("q",5);
//返回与给定字符串名称的类或接口相关联的 类对象
Class<?> class1=Class.forName("com.springboot_call_police.mode.WeChatMode.DeviceModeOne");
//获取该类指定方法,参数1是指定的方法名,参数二是方法中的第一个参数,如果有多个参数以逗号分割,并添加方法中参数类型的类,如String.class Map.class int.class等,如果没有参数则不填写
Method method1=class1.getMethod("text11",Map.class);
Object o=class1.newInstance();
//调用方法,参数1为实例化的对象,参数2为方法中的参数
map1= (Map<Object, Object>) method1.invoke(o,map);
System.out.println(map1.get("q")+"=============");
} catch (Exception e) {
e.printStackTrace();
}
}
被调用类:
package com.springboot_call_police.mode.WeChatMode;
import java.util.HashMap;
import java.util.Map;
public class DeviceModeOne {
public Map<Object,Object> text11(Map<String,Object> map){
int i= (int) map.get("q");
i=i+5;
Map<Object,Object> map1=new HashMap<>();
map1.put("q",i);
System.out.println(i+"******");
return map1;
}
}