Java如何通过反射将map转换为实体对象
作者:智航云科技
在Java开发中,常需要将XML配置数据转为Map,并最终映射到实体对象上,通过单例模式管理XML转换后的Map,并利用Java反射机制,通过属性名称匹配将Map的值赋给实体对象的对应属性,这种方法忽略了数据类型转换,适用于数据类型一致的简单场景,需要类型转换时
Java通过反射将map转换为实体对象
开发一个功能,需要将map的值赋予到实体对象中。其中一些固定数据是通过XML配置的,通过工具将XML转换为Map,作为单例对象供系统使用。然后我开发的接口最终返回的是实体对象,所以需要将map转为实体对象,也就是将map中存储的值赋予到实体对象上。
我使用java的反射,然后通过for循环,将反射获取的实体类属性名称与map中的字段列名进行比对,如果一致则进行赋值。
当然这里没有考虑值的数据类型,都是通过Object类型直接赋值的。
我当前使用没有问题,如果有类型强烈要求的需要调整,增加类型判断后再进行赋值。
以下是个简单demo的代码实现
可参考:
import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; import java.util.HashMap; /** * 将map转换为 实体对象 */ public class MapToObjectUtils { public static void main(String[] args) throws Exception { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id",1); map.put("name","张三"); map.put("sex","男"); map.put("age",18); // 使用反射 User user = new User(); Class<? extends User> aClass = user.getClass(); // 获得某个类的所有声明的字段,即包括public、private和 proteced Field[] fields = aClass.getDeclaredFields(); for (String key:map.keySet()){ for(Field field:fields){ // 设置属性权限,设置为true 可屏蔽java语言的访问检测,使得私有对象也可被访问 field.setAccessible(true); // 如果属性名称和map中的key一致,则可以进行赋值 if(StringUtils.equals(key,field.getName())){ field.set(user,map.get(key)); } } } System.out.println(user.toString()); } }
实体类
class User{ private Integer id; /** * 姓名 */ private String name; /** * 性别 */ private String sex; /** * 年龄 */ private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。