大家好,又见面了,我是你们的朋友全栈君。
背景介绍
今天在项目研发的过程中遇到这样一个需求,在一个统一处理类的入口要将所有后面处理流程需要用到的值统一塞进上下文的MAP对象中,这其中就包括了一持久层的DO对象。
如果对于对象进行逐个遍历是可以实现这个需求,但代码量比较大,所以一直在寻求一种比较合理的处理方式。后来发现可以通过反射的方式实现这个功能。
原理说明
反射概念
-
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
-
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
功能作用
-
在运行时可以动态获取一个对象属于哪个类
-
在运行时可以动态创建一个类的对象
-
在运行时可以获取类的属性和方法
-
在运行时可以调用对象的任何方法
-
可以实现动态代理
实现方式
- 通过Object类的getClass方法
Class cla = obj.getClass
- 通过对象实例方法获取对象
Class cla = String.class
- 通过Class.forName()方法
Class cla = Class.forName(xxx.xxx.Student)
方法介绍
关键字 | 含义 |
---|---|
getDeclaredMethods() | 获取所有的方法 |
getDeclareFields() | 获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段 |
getFields() | 获得某个类的所有的公共(public)的字段,包括父类中的字段 |
getDeclaredField(String name) | 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段 |
getReturnType() | 获得方法的放回类型 |
getParameterTypes() | 获得方法的传入参数类型 |
getDeclaredMethod(“方法名”,参数类型.class,……) | 获得特定的方法 |
构造方法关键字 | 含义 |
---|---|
getDeclaredConstructors() | 获取所有的构造方法 |
getDeclaredConstructor(参数类型.class,……) | 获取特定的构造方法 |
父类和父接口 | 含义 |
---|---|
getSuperclass() | 获取某类的父类 |
getInterfaces() | 获取某类实现的接口 |
实例展示
参考实例 反射实例链接
对象转MAP
- 创建测试对象
package source.reflect;
public class TestReflect {
private String no;
private String name;
private int age;
public TestReflect(String no, String name, int age) {
super();
this.no = no;
this.name = name;
this.age = age;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 通过反射将对象转换为Map
package source.reflect;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class TestObjToMap {
public static Map<String, Object> convertObjToMap(Object obj) throws Exception{
Map<String, Object> map = new HashMap<String, Object>();
Field[] fields = obj.getClass().getDeclaredFields();
for(int i = 0; i < fields.length; i++){
Field field = obj.getClass().getDeclaredField(fields[i].getName());
field.setAccessible(true);
Object value = field.get(obj);
map.put(fields[i].getName(), value);
}
return map;
}
public static void main(String[] args) throws Exception {
TestReflect testReflect = new TestReflect("1", "test", 20);
Map<String, Object> map = convertObjToMap(testReflect);
System.out.println(map);
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/131985.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...