Map与JavaBean互转原理(内省机制)
来源:互联网 发布:美工这个工作发展前景 编辑:程序博客网 时间:2024/06/04 22:51
1.javabean 转 map
- 定义一个Person的javabean
public class Person { private String name; private int age; public Person() { super(); } public Person(String name,int age){ this.name=name; this.age=age; } 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; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
解说:
定义一个Person的javabean是用来下面演示demo使用
- 将map集合转javabean
/** * javabean转成map * @param obj * @return * @throws Exception */ public static Map<String,Object> bean2Map(Object obj) throws Exception{ Map<String, Object> map =new HashMap<>(); // 获取person类的BeanInfo对象 BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); //获取属性描述器 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { //获取属性名 String key = propertyDescriptor.getName(); if(key.equals("class")) continue; //获取该属性的值 Method readMethod = propertyDescriptor.getReadMethod(); ////通过反射来调用Person的定义的getName()方法 Object value = readMethod.invoke(obj); map.put(key, value); } return map; } /** * 打印map集合 * @param map */ private static void printMap(Map<String, Object> map) { for (Entry<String, Object> m : map.entrySet()) { System.out.println(m.getKey()+"="+m.getValue()); } System.out.println("---------------------------------"); } ------------------------------- 执行main方法: public static void main(String[] args) throws Exception { Person per=new Person("liujun",12); Map<String, Object> bean2Map = bean2Map(per); printMap(bean2Map); } ---------------------- 输出的结果: name=liujun age=12 ---------------------------------
解说:
1.Introspector 类:获取person类的BeanInfo对象
2.BeanInfo 类:person类的BeanInfo对象
3.PropertyDescriptor 类:person类的属性描述器
2.map 转 javabean
/** * map集合转javabean * @param map * @param clz * @return * @throws Exception */ public static <T>T map2Bean(Map<String,Object> map , Class<T> clz) throws Exception{ //new 出一个对象 T obj=clz.newInstance(); // 获取person类的BeanInfo对象 BeanInfo beanInfo = Introspector.getBeanInfo(clz); //获取属性描述器 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { //获取属性名 String key = propertyDescriptor.getName(); Object value=map.get(key); if(key.equals("class")) continue; Method writeMethod = propertyDescriptor.getWriteMethod(); //通过反射来调用Person的定义的setName()方法 writeMethod.invoke(obj,value); } return obj; } ------------------------------- 执行main方法: public static void main(String[] args) throws Exception { Person per=new Person("liujun",12); Map<String, Object> bean2Map = bean2Map(per); printMap(bean2Map); Person map2Bean = map2Bean(bean2Map, Person.class); System.out.println(map2Bean.toString()); } ----------------------------- 输出的结果: name=liujun age=12 --------------------------------- Person [name=liujun, age=12]
3.转换的原理(内省机制)
什么是内省机制?
内省机制是获取JavaBean的成员(事件,方法,属性),设置/获取属性值
内省机制与反射有什么区别?
反射是获取类的字节码对象,通过字节码对象创建类的对象,调用相关方法
内省机制的核心类:
Introspector
Introspector类为访问目标Jave Bean支持的属性、事件和方法提供了标准方法。对于属性、事件和方法中的每一类信息,Introspector会分别分析目标bean以及其父类,寻找显式或隐式信息并用其构建一个能够全面描述目标bean的BeanInfo对象。过调用Introspector.getBeanInfo()方法来获得指定类的bean信息
BeanInfo
BeanInfo类是为了获取对bean属性的控制权。只需提供属性名和所属的bean类,就可以为每个属性构建一个PropertyDescriptor
PropertyDescriptor
PropertyDescriptor是属性描述器,通过PropertyDescriptor可以获取javabean中的定义的属性、事件和方法。
内省机制代码的分析:
public static void main(String[] args) throws Exception { //通过Introspector获取person类的BeanInfo对象 BeanInfo beanInfo = Introspector.getBeanInfo(Person.class); //通过beanInfo对象获取属性描述器propertyDescriptors PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); //遍历每一个属性描述器PropertyDescriptors for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { System.out.println("-------------"); //获取某个属性的名称:例如:Person的定义的name属性名 System.out.println(propertyDescriptor.getName()); //获取某个属性的类型:例如:Person的定义的name属性的类型是class java.lang.String System.out.println(propertyDescriptor.getPropertyType()); //获取某个属性的getxxx()方法,例如:Person的定义的getName()方法 Method readMethod = propertyDescriptor.getReadMethod(); //获取某个属性的setxxx()方法,例如:Person的定义的setName()方法 Method writeMethod = propertyDescriptor.getWriteMethod(); System.out.println(readMethod); System.out.println(writeMethod); } } ------------------------------- 输出的结果: ------------- age int public int xmg.day24.neisheng.Person.getAge() public void xmg.day24.neisheng.Person.setAge(int) ------------- class class java.lang.Class public final native java.lang.Class java.lang.Object.getClass() null ------------- name class java.lang.String public java.lang.String xmg.day24.neisheng.Person.getName() public void xmg.day24.neisheng.Person.setName(java.lang.String)
1 0
- Map与JavaBean互转原理(内省机制)
- 使用Introspector(Java内省机制)实现Map转换为JavaBean
- [学习笔记]Java内省机制(JavaBean)
- 高薪笔记----内省机制(IntorSpector)----javabean
- javaBean的内省机制
- 浅谈javabean,.内省机制
- javaBean内省机制
- 反射,内省与javaBean
- 内省与javaBean
- 内省IntroSpector与JavaBean
- JavaBean与内省
- JavaBean与内省
- javaBean与内省操作
- 通过内省机制设置JavaBean
- 《JavaBean》-----Java的内省机制
- 黑马程序员-------高薪笔记----内省机制(IntorSpector)----javabean
- java反射机制(3)---关于Javabean的内省
- 内省(javaBean)
- 最小生成树-Kruskal算法(模板)
- 如何判断是微信内置浏览器或者支付宝内置浏览器
- 常用正则表达式
- mybatis查询字段为空返回另一个字段的值
- [leetcode] 103. Binary Tree Zigzag Level Order Traversal
- Map与JavaBean互转原理(内省机制)
- 求n^k的前几位数和后几位数
- mipi 调试经验
- POJ 1050.To the Max
- 时区设置
- Visual Studio 2015简体中文企业版/专业版下载+有效激活密钥
- rabbitmq 路由 java实现
- SDUT OJ 3378 数据结构实验之查找六:顺序查找
- gettext简介