![cd448bfc665983fc56114dd0f2b356a8.png](https://img-blog.csdnimg.cn/img_convert/cd448bfc665983fc56114dd0f2b356a8.png)
利用反射机制将map转换为bean
在Java的世界里,将一个Map转换为Bean有很多种实现方法。因为针对这个转换,很多开源项目中都提供工具类来实现,例如Spring、Gson等等。
虽然很多工具类都提供了此类方法,但是对于基础的实现原理,我仍觉得有必要了解一下,免得出现“知其然,而不知其所以然”的情况。
对于反射而言,首先需要明确到底是在反射什么?例如一个Map对象和一个Person实体对象,反射的实质是Map中Key和Person中同名属性的反射,通过java.lang.reflect来实现上述转换过程。
代码如下:
/** * 对象实体类 * @author www.51sds.net */public class Person { private String name; private int age; private String address; 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; } public String getAddress(){ return address; } public void setAddress(String address){ this.address = address; } @Override public String toString(){ return "Person{" + "name='" + name + ''' + ", age=" + age + ", address='" + address + ''' + '}'; }}
import java.lang.reflect.Field;import java.util.HashMap;import java.util.Map;/** * map转换为bean工具类 * @author www.51sds.net */public class MapToBeanUtil { public static void main(String[] args) { Map map = new HashMap<>(); map.put("name", "张三"); map.put("age", 30); map.put("address", "北京"); Person person = toBean(map, Person.class); System.out.println(person); } public static T toBean(Map beanPropMap, Class type) { try { T beanInstance = type.getConstructor().newInstance(); for (Object k : beanPropMap.keySet()) { String key = (String) k; Object value = beanPropMap.get(k); if (value != null) { try { Field field = type.getDeclaredField(key); field.setAccessible(true); field.set(beanInstance, value); field.setAccessible(false); } catch (Exception e) { e.printStackTrace(); } } } return beanInstance; } catch (Exception e) { e.printStackTrace(); } return null; }}
/** * 输出结果 * @author www.51sds.net */Person{name=’张三’, age=30, address=’北京’}