* 实现Javabean和Map之间的转化
* 1)Javabean拥有多组属性名和属性值
*,每一个属性名对应一个属性值
* 2)Map有多组key-value,
每一个key对应一个value,可以是不同的两者等价
*
* map:
* Map 集合类用于存储元素对(称作“键”和“值”),
*其中每个键映射到一个值。
*
* 1.put(Object key, Object value) 将指定值与指定键相关联
* 2.clear() 从 Map 中删除所有映射
* 3.remove(Object key) 从 Map 中删除键和关联的值
* 4.putAll(Map t) 将指定 Map 中的所有映射复制到此 map
1 package com.first.javabeantomap;
2
3 import com.first.javabean.Person;
4
5 import java.beans.BeanInfo;
6 import java.beans.IntrospectionException;
7 import java.beans.Introspector;
8 import java.beans.PropertyDescriptor;
9 import java.lang.reflect.InvocationTargetException;
10 import java.util.HashMap;
11 import java.util.Iterator;
12 import java.util.Map;
13 import java.util.Set;
14
15 /**
16 * 实现Javabean和Map之间的转化
17 * 1)Javabean拥有多组属性名和属性值
18 *,每一个属性名对应一个属性值
19 * 2)Map有多组key-value,
20 * 每一个key对应一个value,可以是不同的两者等价
21 *
22 * map:
23 * Map 集合类用于存储元素对(称作“键”和“值”),
24 *其中每个键映射到一个值。
25 *
26 * 1.put(Object key, Object value) 将指定值与指定键相关联
27 * 2.clear() 从 Map 中删除所有映射
28 * 3.remove(Object key) 从 Map 中删除键和关联的值
29 * 4.putAll(Map t) 将指定 Map 中的所有映射复制到此 map
30 */
31 public class JavaToMap {
32
33 public static void main(String[] args)
34 throws IllegalAccessException, IntrospectionException,
35 InvocationTargetException, InstantiationException {
36 //创建一个Person实例
37 Person person=new Person();
38 Map<String,Object> map=javabeanToMap(person);//throws IllegalAccessException, IntrospectionException, InvocationTargetException
39 System.out.println(map);
40
41 //创建javabean对象
42
43 Object obj=mapToJavabean1(Person.class,map);
44 System.out.println(obj);
45
46 Person p=mapToJavabean2(Person.class,map);
47 System.out.println(p);
48
49 }
50
51 /**
52 * Javabean转化为Map
53 * @return
54 */
55 public static Map<String ,Object> javabeanToMap(Object bean) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
56 Map<String ,Object> map=new HashMap<>();
57 //获取javabean的对象
58 BeanInfo beanInfo=Introspector.getBeanInfo(bean.getClass(),Object.class);
59 //获取javabean中的属性描述器
60 PropertyDescriptor[] descriptor=beanInfo.getPropertyDescriptors();
61 for (PropertyDescriptor pds:descriptor){
62 String name=pds.getName();
63 //调用getter方法,获取属性值
64 Object value=pds.getReadMethod().invoke(bean);//抛出异常
65 map.put(name,value);
66
67 }
68 return map;
69 }
70
71 /**
72 * Map转化为Javabean
73 * 写法一
74 * @return
75 */
76 private static Object mapToJavabean1(Class beanType,Map map) throws IllegalAccessException, InstantiationException, IntrospectionException, InvocationTargetException {
77 //创建javabean对象
78 BeanInfo beanInfo=Introspector.getBeanInfo(beanType,Object.class);//抛出异常
79 Object obj=beanType.newInstance();
80 //获取javabean的属性描述器
81 PropertyDescriptor[] descriptors=beanInfo.getPropertyDescriptors();
82 //给JavaBean对象赋值
83 for (PropertyDescriptor pds:descriptors){
84 //获取与属性同名的key值
85 Object value=map.get(pds.getName());
86 //调用setter方法
87 pds.getWriteMethod().invoke(obj,value);//抛出异常
88 }
89
90 return obj;
91 }
92
93
94 /**
95 * Map转化为Javabean
96 * 写法二:推荐使用这种方法
97 * 与第一种方法不同的是返回的时候进行了类型转化,方便用者
98 * @return
99 */
100 private static <T>T mapToJavabean2(Class<T>beanType,Map<String,Object> map) throws IllegalAccessException, InstantiationException, IntrospectionException, InvocationTargetException {
101 //创建javabean对象
102 BeanInfo beanInfo=Introspector.getBeanInfo(beanType,Object.class);//抛出异常,Object.class不能少,-否则出现空指针异常
103 Object obj=beanType.newInstance();
104 //获取javabean的属性描述器
105 PropertyDescriptor[] descriptors=beanInfo.getPropertyDescriptors();
106 //给JavaBean对象赋值
107 for (PropertyDescriptor pds:descriptors){
108 //获取与属性同名的key值
109 Object value=map.get(pds.getName());
110 //调用setter方法
111 pds.getWriteMethod().invoke(obj,value);//抛出异常
112 }
113 return (T)obj;//返回的时候强转
114 }
115
116 }