使用Introspector(Java内省机制)实现Map转换为JavaBean
2017-06-13 11:53
471 查看
需求:
有一个Map对象
希望实现一个通用方法,将其转换为如下的JavaBean
工具类
注意事项:
1. Map的key与JavaBean的key一致
2. JavaBean中要有空的构造函数,以及get,set方法
参考:java 中的内省机制
有一个Map对象
Map<String,Object> map = new HashMap<>(); map.put("name", "bellychang"); map.put("likes", new String[]{"football", "basketball"});
希望实现一个通用方法,将其转换为如下的JavaBean
public class SimpleBean { private String name; private String[] likes; public SimpleBean() { } public SimpleBean(String name, String[] likes){ this.name = name; this.likes = likes; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String[] getLikes() { return likes; } public void setLikes(String[] likes) { this.likes = likes; } @Override public String toString() { return "SimpleBean{" + "name='" + name + '\'' + ", likes=" + Arrays.toString(likes) + '}'; } }
工具类
public static <T> T convertMap(Class<T> type, Map map) throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException { BeanInfo beanInfo = null; // 获取类属性 T obj = null; beanInfo = Introspector.getBeanInfo(type); // 创建 JavaBean 对象 obj = type.newInstance(); // 给 JavaBean 对象的属性赋值 // 获取属性的描述器(PropertyDescriptor) PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); // 通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后就可以通过反射机制来调用这些方法 for (int i = 0; i < propertyDescriptors.length; i++) { PropertyDescriptor descriptor = propertyDescriptors[i]; String propertyName = descriptor.getName(); if (map.containsKey(propertyName)) { // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。 Object value = map.get(propertyName); Object[] args = new Object[1]; //getPropertyType得到属性类型 if (descriptor.getPropertyType() == Long.class) { args[0] = Long.parseLong(value.toString()); } else if (descriptor.getPropertyType() == Integer.class) { args[0] = Integer.valueOf(value.toString()); } else { args[0] = value; } //getWriteMethod()得到此属性的set方法----Method对象,然后用invoke调用这个方法 descriptor.getWriteMethod().invoke(obj, args); } } return obj; }测试类
@Test public void testConvertMap() throws Exception { //将一个Map对象转换为JavaBean Map<String,Object> map = new HashMap<>(); map.put("name", "changliang"); map.put("likes", new String[]{"football", "basketball"}); SimpleBean simpleBean = BeanToMapUtil.convertMap(SimpleBean.class, map); System.out.println(simpleBean); }
注意事项:
1. Map的key与JavaBean的key一致
2. JavaBean中要有空的构造函数,以及get,set方法
参考:java 中的内省机制
相关文章推荐
- 使用内省机制实现Map与Bean之间的转换
- 利用Java的反射机制实现Bean实体与Map自动转换的工具类
- 使用Java的内省和注解将JavaBean转换成Map
- java 使用ObjectMapper的方式实现Json和bean的转换
- 通过java的反射机制实现Map、JavaBean、JSON的相互转换工具类
- java注解实现map与bean之间的转换
- java 使用BeanInfo实现bean实体与map之间的互相转换
- Java中将JSON格式的数据转换成对应的Bean、Map、List数据
- JAVA内省JavaBean(Introspector、BeanInfo和PropertyDescriptor)
- Java实现将Map转换为List的小代码
- Java内省机制和 BeanUtils实现
- 使用Java中RMI机制来实现分布式程序
- JAVA的内省机制(introspector)与反射机制(reflection)
- 对于复杂javabean到json串的转换,建议使用FlexJSON
- JAVA的内省机制(introspector)与反射机制(reflection)
- 使用java.beans.XMLEncoder类把bean转换成XML文件
- JAVA Map转换为Bean或VO
- 黑马程序员---javaBean & introspector(内省)
- 使用JAVA中RMI机制来实现分布式程序(2)
- JAVA的内省机制(introspector)与反射机制(reflection)[转]