开发一个功能,需要将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 +
'}';
}
}