`

javaBean与Map<String,Object>互转

 
阅读更多
1. 为什么要实现javaBean与Map<String,Object>相互转换?

用过spring的都知道spring的MVC框架中有一个BaseCommandController对象,利用这个对象我们就可以很方便的将从客户端传递过来的参数封装到一个JavaBean对象中去,而不需要我们request.getParameter("name");bean.setName(name);了,从而也简化了不少的工作。如果大家用过BeanUtils.populate的话,就知道,这个方法是可以很方便的将request提交的页面表单自动填写到你创建的对象中

2. 如何实现javaBean与Map<String,Object>相互转换?

方法1: 利用java.beans.Introspector和java.beans.PropertyDescriptor实现javaBean与Map<String,Object>互转

方法2: 利用org.apache.commons.beanutils.BeanUtils工具类,BeanUtils.populate实现Map 转换为javaBean


  1. packagejavaStudyDemo.bean.reflect.test;
  2. importjava.beans.BeanInfo;
  3. importjava.beans.Introspector;
  4. importjava.beans.PropertyDescriptor;
  5. importjava.lang.reflect.Method;
  6. importjava.util.HashMap;
  7. importjava.util.Map;
  8. importjavaStudyDemo.others.PersonBean;
  9. importorg.apache.commons.beanutils.BeanUtils;
  10. /**
  11. *当把Person类作为BeanUtilTest的内部类时,程序出错<br>
  12. *java.lang.NoSuchMethodException:Property'**'hasnosettermethod<br>
  13. *本质:内部类和单独文件中的类的区别<br>
  14. *BeanUtils.populate方法的限制:<br>
  15. *Theclassmustbepublic,andprovideapublicconstructorthatacceptsnoarguments.<br>
  16. *Thisallowstoolsandapplicationstodynamicallycreatenewinstancesofyourbean,<br>
  17. *withoutnecessarilyknowingwhatJavaclassnamewillbeusedaheadoftime
  18. */
  19. publicclassBeanUtilTest{
  20. publicstaticvoidmain(String[]args){
  21. PersonBeanperson=newPersonBean();
  22. Map<String,Object>mp=newHashMap<String,Object>();
  23. mp.put("name","Mike");
  24. mp.put("age",25);
  25. mp.put("mN","male");
  26. //将map转换为bean
  27. transMap2Bean2(mp,person);
  28. System.out.println("---transMap2BeanMapInfo:");
  29. for(Map.Entry<String,Object>entry:mp.entrySet()){
  30. System.out.println(entry.getKey()+":"+entry.getValue());
  31. }
  32. System.out.println("---BeanInfo:");
  33. System.out.println("name:"+person.getName());
  34. System.out.println("age:"+person.getAge());
  35. System.out.println("mN:"+person.getmN());
  36. //将javaBean转换为map
  37. Map<String,Object>map=transBean2Map(person);
  38. System.out.println("---transBean2MapMapInfo:");
  39. for(Map.Entry<String,Object>entry:map.entrySet()){
  40. System.out.println(entry.getKey()+":"+entry.getValue());
  41. }
  42. }
  43. //Map-->Bean2:利用org.apache.commons.beanutils工具类实现Map-->Bean
  44. publicstaticvoidtransMap2Bean2(Map<String,Object>map,Objectobj){
  45. if(map==null||obj==null){
  46. return;
  47. }
  48. try{
  49. BeanUtils.populate(obj,map);
  50. }catch(Exceptione){
  51. System.out.println("transMap2Bean2Error"+e);
  52. }
  53. }
  54. //Map-->Bean1:利用Introspector,PropertyDescriptor实现Map-->Bean
  55. publicstaticvoidtransMap2Bean(Map<String,Object>map,Objectobj){
  56. try{
  57. BeanInfobeanInfo=Introspector.getBeanInfo(obj.getClass());
  58. PropertyDescriptor[]propertyDescriptors=beanInfo.getPropertyDescriptors();
  59. for(PropertyDescriptorproperty:propertyDescriptors){
  60. Stringkey=property.getName();
  61. if(map.containsKey(key)){
  62. Objectvalue=map.get(key);
  63. //得到property对应的setter方法
  64. Methodsetter=property.getWriteMethod();
  65. setter.invoke(obj,value);
  66. }
  67. }
  68. }catch(Exceptione){
  69. System.out.println("transMap2BeanError"+e);
  70. }
  71. return;
  72. }
  73. //Bean-->Map1:利用Introspector和PropertyDescriptor将Bean-->Map
  74. publicstaticMap<String,Object>transBean2Map(Objectobj){
  75. if(obj==null){
  76. returnnull;
  77. }
  78. Map<String,Object>map=newHashMap<String,Object>();
  79. try{
  80. BeanInfobeanInfo=Introspector.getBeanInfo(obj.getClass());
  81. PropertyDescriptor[]propertyDescriptors=beanInfo.getPropertyDescriptors();
  82. for(PropertyDescriptorproperty:propertyDescriptors){
  83. Stringkey=property.getName();
  84. //过滤class属性
  85. if(!key.equals("class")){
  86. //得到property对应的getter方法
  87. Methodgetter=property.getReadMethod();
  88. Objectvalue=getter.invoke(obj);
  89. map.put(key,value);
  90. }
  91. }
  92. }catch(Exceptione){
  93. System.out.println("transBean2MapError"+e);
  94. }
  95. returnmap;
  96. }
  97. }


  1. publicclassPersonBean{
  2. privateStringname;
  3. privateIntegerage;
  4. privateStringmN;
  5. /**
  6. *@returnthemN
  7. */
  8. publicStringgetmN(){
  9. returnmN;
  10. }
  11. /**
  12. *@parammNthemNtoset
  13. */
  14. publicvoidsetmN(StringmN){
  15. this.mN=mN;
  16. }
  17. /**
  18. *@returnthename
  19. */
  20. publicStringgetName(){
  21. returnname;
  22. }
  23. /**
  24. *@paramnamethenametoset
  25. */
  26. publicvoidsetName(Stringname){
  27. this.name=name;
  28. }
  29. /**
  30. *@returntheage
  31. */
  32. publicIntegergetAge(){
  33. returnage;
  34. }
  35. /**
  36. *@paramagetheagetoset
  37. */
  38. publicvoidsetAge(Integerage){
  39. this.age=age;
  40. }
  41. }


总结: javaBean与Map<String,Object>互转利用到了java的内省(Introspector)和反射(reflect)机制。 其思路为:通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器PropertyDescriptor,再利用属性描述器获取某个属性对应的getter/setter方法,然后通过反射机制来getter和setter。


什么是内省?

内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如类PersonBean中有属性name,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则(但你最好还是要搞清楚),这些API存放于包java.beans中。注意: PersonBean中属性mN的getter/setter方法必须满足javaBean命名规范,即getmN,不能写作getMN,否则转换失败。详情参考 http://blog.renren.com/share/236384819/5598710664

分享到:
评论

相关推荐

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List&lt;Map&lt;String, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List&lt;Map&lt;String, Object&gt;...

    javabean_map_string和json互转详细文档+例子

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); map.put("name", "John"); map.put("age", 30); ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(map); System.out....

    json转Map,转javaBean,javBean和Map转json

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); for (PropertyDescriptor pd : Introspector.getBeanInfo(obj.getClass()).getPropertyDescriptors()) { try { map.put(pd.getName(), pd.getReadMethod().invoke...

    Map 转为Object Object 转为 Map java jdk1.4以上

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); Class&lt;?&gt; clazz = obj.getClass(); for (Field field : clazz.getFields()) { field.setAccessible(true); map.put(field.getName(), field.get(obj)); } return...

    map与Javabean相互转换实例

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); Class&lt;?&gt; clazz = bean.getClass(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); map.put(field.getName(), field.get(bean)); ...

    java实用教程

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); map.put("key1", "value1"); list.add(map); String jsonString = JSON.toJSONString(list); ``` 反序列化: ```java List&lt;Map&lt;String, Object&gt;&gt; list2 = ...

    首字母大写的json串转为javabean实例

    首先,解析JSON字符串到`Map&lt;String, Object&gt;`,然后遍历这个映射,将键(属性名)转换为驼峰式,并创建对应的JavaBean实例,设置属性值。 5. **使用工具类或方法**:可以创建一个静态方法或者工具类,接收JSON字符...

    Desktop_javaBean转换Map工具_

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); if (bean != null) { Class&lt;?&gt; clazz = bean.getClass(); try { for (Method method : clazz.getMethods()) { if (method.getName().startsWith("get") && method...

    commons-beanutils-1.9.4

    &lt;artifactId&gt;commons-beanutils&lt;/artifactId&gt; &lt;version&gt;1.9.4&lt;/version&gt; &lt;/dependency&gt; ``` 然后,你可以开始使用BeanUtils提供的API,例如设置一个JavaBean的属性: ```java import org.apache.commons....

    FreeMarker学习笔记

    Map&lt;String, Object&gt; root = new HashMap&lt;&gt;(); root.put("person", p); Writer out = new FileWriter(new File(dir + "hello.html")); template.process(root, out); out.flush(); out.close(); ``` 这样,模板处理...

    java中fastjson生成和解析json数据(序列化和反序列化数据)

    它可以解析JavaBean、List&lt;JavaBean&gt;、List&lt;String&gt;以及List&lt;Map&lt;String, Object&gt;&gt;等多种类型。 - 解析JSON字符串为JavaBean:通过`JSON.parseObject(jsonString, Person.class)`将JSON字符串解析为JavaBean对象。 ...

    mybatis动态sql及参数的传递

    Map&lt;String, Object&gt; params = new HashMap&lt;&gt;(); params.put("username", "John"); params.put("age", 30); List&lt;User&gt; users = sqlSession.selectList("selectUser", params); ``` 2. JavaBean参数示例: ```java ...

    json与JavaBean、Map和list之间的转换问题.doc

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); map.put("name", "json"); map.put("bool", Boolean.TRUE); map.put("int", new Integer(3)); map.put("arr", new String[] {"a", "b"}); map.put("func", ...

    Springboot2.1.4+redis+mysql

    Map&lt;String,Object&gt; map = new HashMap&lt;&gt;(); // String objectStr="{\\\\"username\":\"老李\",\"nickname\":\"李刚\",\"remark\":\"肚痛\"}"; // String basestr = Base64.getBase64(objectStr); String ...

    JavaBean和Map转换封装类的方法

    List&lt;Map&lt;String, Object&gt;&gt; userListMap = new ArrayList&lt;&gt;(); // 填充userListMap... List&lt;User&gt; userList = MapUtils.map2JavaList(new User(), userListMap); ``` 总之,JavaBean和Map之间的转换在Java开发中...

    json需要的jar包

    在本例中,`json-lib-2.4-jdk15` 版本是针对JDK1.5编译的,它支持多种数据类型,包括JavaBean、Map、Collection、Array等,使得在Java中处理JSON数据变得非常直观。 要使用这些库,首先需要将jar包添加到项目的类...

    json_lib使用实例:java对象与json字符串的互转

    Map&lt;String, Object&gt; map = new HashMap&lt;&gt;(); map.put("name", "John"); map.put("age", 30); String jsonString = JSONObject.fromObject(map).toString(); Map&lt;String, Object&gt; deserializedMap = (Map...

    springMVC往jsp页面传数据

    Map&lt;String, Object&gt; result = new HashMap&lt;&gt;(); result.put("msg", "Hello from SpringMVC!"); return result; } ``` #### 三、JSP页面处理从SpringMVC传来的数据 在JSP页面中处理来自SpringMVC的数据主要...

    Struts 2 第三章

    Map&lt;String, Object&gt; request = ActionContext.getContext().getServletRequest(); // 或者 HttpServletRequest request = ServletActionContext.getRequest(); // 获取session对象 HttpSession session = ...

    fastJSON文档

    Fastjson 支持广泛的 JDK 类型,包括基本数据类型、JavaBean、集合(如 List 和 Set)、Map、枚举(Enum)以及泛型。此外,它还特别处理了循环引用的情况,使得在处理包含相互引用的对象结构时仍能保持高效。...

Global site tag (gtag.js) - Google Analytics