使用内省机制实现Map与Bean之间的转换

来源:互联网 发布:松山五小网络办公平台 编辑:程序博客网 时间:2024/06/09 19:55

1.什么是java内省机制?

        内省(IntroSpector)是Java 语言对 Bean 类属性、事件的一种缺省处理方法。 JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。

       与反射不同的是反射是在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。

      个人肤浅理解,说白了内省主要就是获取类的属性描述器,通过setter、getter方法来操纵成员变量获取和设置值。

2. 说了这么多,直接上干货

         2.1定义实体类         

import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Student {private Long id;private String name;private boolean admin;}

        2.2集合Map与Bean之间的转换

import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.util.HashMap;import java.util.Map;@SuppressWarnings("all")public class JavaBeanDemo {public static void main(String[] args) throws Exception {Student stu = new Student(1L, "小明", true);Map<String, Object> bean2map = bean2map(stu);System.out.println("bean2map:" + bean2map);Map<String, Object> map = new HashMap();map.put("id", 2L);map.put("name", "小红");map.put("admin", false);Student map2bean = map2bean(map, Student.class);System.out.println("map2bean:" + map2bean);}private static Map<String, Object> bean2map(Object obj) throws Exception {Class clazz = obj.getClass();Map<String, Object> map = new HashMap<>();BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);//设置上限为Object,否则有Object的方法PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();for (PropertyDescriptor pd : pds) {map.put(pd.getName(), pd.getReadMethod().invoke(obj));}return map;}public static <T> T map2bean(Map<String, Object> map, Class clazz) throws Exception {T obj = (T) clazz.newInstance();BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();for (PropertyDescriptor pd : pds) {String key = pd.getName();pd.getWriteMethod().invoke(obj, map.get(key));}return obj;}}
        

         2.3测试结果:




原创粉丝点击