首页 > 编程语言 >BeanUtils beanjavaBean与Map互转

BeanUtils beanjavaBean与Map互转

时间:2023-05-16 13:05:09浏览次数:54  
标签:map java String Map beanjavaBean 互转 return public


import java.lang.reflect.InvocationTargetException;  
import java.util.Map;  

import org.apache.commons.beanutils.BeanUtils;  

public class test {  


    public static void main(String[] args) {  
        Person person1=new Person();  
        person1.setName("name1");  
        person1.setSex("sex1");  
        Map<String, String> map=null;  
        try {  
            map = BeanUtils.describe(person1);  

    //=============Bean转换成Map=======================//  
            System.out.println(map.size()+">>>>>>>>>>>");  
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        } catch (InvocationTargetException e) {  
            e.printStackTrace();  
        } catch (NoSuchMethodException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  

        Person person=test.map2Bean(map, Person.class);  
        System.out.println(person.getName());  
    }  

    /** 
     *  
     *  
     * Map转换层Bean,使用泛型免去了类型转换的麻烦。 
     * @param <T> 
     * @param map   
     * @param class1 
     * @return 
     */  
    public static <T> T map2Bean(Map<String, String> map, Class<T> class1) {  
        T bean = null;  
        try {  
            bean = class1.newInstance();  
            BeanUtils.populate(bean, map);  
        } catch (InstantiationException e) {  
            e.printStackTrace();  
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        } catch (InvocationTargetException e) {  
            e.printStackTrace();  
        }  
        return bean;  
    }  
}




[size=large][color=red]其他例子[/color][/size]


[url]http://stackoverflow.com/questions/21720128/beanutils-converting-java-util-map-to-nested-bean[/url]




[color=red][b]Map转换到Bean[/b][/color]


BeanOne.java



import java.util.Map;

public class BeanOne {
    private String fieldOne;
    private Map<String,BeanTwo> fieldTwo;
    public Map<String, BeanTwo> getFieldTwo() {
        return fieldTwo;
    }

    public void setFieldTwo(Map<String, BeanTwo> fieldTwo) {
        this.fieldTwo = fieldTwo;
    }

    public String getFieldOne() {
        return this.fieldOne;
    }

    public void setFieldOne(String fieldOne) {
        this.fieldOne = fieldOne;
    }
}




BeanTwo.java



public class BeanTwo {
    private String fieldOne;

    public String getFieldOne() {
        return this.fieldOne;
    }

    public void setFieldOne(String fieldOne) {
        this.fieldOne = fieldOne;
    }
}




Tester.java



import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class Tester {
    public static void main(String[] args) throws IllegalAccessException,
            InvocationTargetException {
        Map beanTwoMap = new HashMap();
        beanTwoMap.put("fieldOne", "fieldOne2222Value");
        Map beanOneMap = new HashMap();
        beanOneMap.put("fieldOne", "fieldOneValue");
        beanOneMap.put("fieldTwo", beanTwoMap);
        BeanOne beanOne = new BeanOne();
        BeanUtils.populate(beanOne, beanOneMap);
        System.out.println(beanOne.getFieldOne());
        System.out.println(beanOne.getFieldTwo().get("fieldOne"));
    }

}


output will be:-



[i]fieldOneValue


fieldOne2222Value[/i]




[color=red][b]javaBean与Map<String,Object>互转[/b][/color]


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


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


package javaStudyDemo.bean.reflect.test;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javaStudyDemo.others.PersonBean;

import org.apache.commons.beanutils.BeanUtils;

/**
 * 当把Person类作为BeanUtilTest的内部类时,程序出错<br>
 * java.lang.NoSuchMethodException: Property '**' has no setter method<br>
 * 本质:内部类 和 单独文件中的类的区别 <br>
 * BeanUtils.populate方法的限制:<br>
 * The class must be public, and provide a public constructor that accepts no arguments. <br>
 * This allows tools and applications to dynamically create new instances of your bean, <br>
 * without necessarily knowing what Java class name will be used ahead of time
 */
public class BeanUtilTest {

    public static void main(String[] args) {

        PersonBean person = new PersonBean();
        Map<String, Object> mp = new HashMap<String, Object>();
        mp.put("name", "Mike");
        mp.put("age", 25);
        mp.put("mN", "male");

        // 将map转换为bean
        transMap2Bean2(mp, person);

        System.out.println("--- transMap2Bean Map Info: ");
        for (Map.Entry<String, Object> entry : mp.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        System.out.println("--- Bean Info: ");
        System.out.println("name: " + person.getName());
        System.out.println("age: " + person.getAge());
        System.out.println("mN: " + person.getmN());

        // 将javaBean 转换为map
        Map<String, Object> map = transBean2Map(person);

        System.out.println("--- transBean2Map Map Info: ");
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

    }

    // Map --> Bean 2: 利用org.apache.commons.beanutils 工具类实现 Map --> Bean
    public static void transMap2Bean2(Map<String, Object> map, Object obj) {
        if (map == null || obj == null) {
            return;
        }
        try {
            BeanUtils.populate(obj, map);
        } catch (Exception e) {
            System.out.println("transMap2Bean2 Error " + e);
        }
    }

    // Map --> Bean 1: 利用Introspector,PropertyDescriptor实现 Map --> Bean
    public static void transMap2Bean(Map<String, Object> map, Object obj) {

        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();

                if (map.containsKey(key)) {
                    Object value = map.get(key);
                    // 得到property对应的setter方法
                    Method setter = property.getWriteMethod();
                    setter.invoke(obj, value);
                }

            }

        } catch (Exception e) {
            System.out.println("transMap2Bean Error " + e);
        }

        return;

    }

    // Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean --> Map
    public static Map<String, Object> transBean2Map(Object obj) {

        if(obj == null){
            return null;
        }        
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();

                // 过滤class属性
                if (!key.equals("class")) {
                    // 得到property对应的getter方法
                    Method getter = property.getReadMethod();
                    Object value = getter.invoke(obj);

                    map.put(key, value);
                }

            }
        } catch (Exception e) {
            System.out.println("transBean2Map Error " + e);
        }

        return map;

    }
}




public class PersonBean {

    private String  name;
    private Integer age;
    private String  mN;

    /**
     * @return the mN
     */
    public String getmN() {
        return mN;
    }

    /**
     * @param mN the mN to set
     */
    public void setmN(String mN) {
        this.mN = mN;
    }


    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * @param age the age to set
     */
    public void setAge(Integer age) {
        this.age = age;
    }

}


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


标签:map,java,String,Map,beanjavaBean,互转,return,public
From: https://blog.51cto.com/u_3871599/6283482

相关文章

  • C/C++ CreateFileMapping 共享内存
    原链接C/C++CreateFileMapping共享内存-lyshark-博客园(cnblogs.com)#include<iostream>#include<Windows.h>usingnamespacestd;intmain(){HANDLEhMap;PINTlpMapAddr;//getfilemapping'shandlehMap=OpenF......
  • 介绍Xmappr
    好像在2010年一月初的时候刚刚发布了0.9版本,这个框架的主要作用就是用来进行读取配置文件(xml)的,但是和以前我们常用的有所不同,他是直接用java的对象和xml进行映射,在我们以前读取xml的时候,哪怕是使用了jdom,dom4j,xpath等的相关API,获得字段仍然失去了他本来的属性,比如说他之前是一个i......
  • abp automapper setting
    @@abpautomappersettinghttps://docs.abp.io/zh-Hans/abp/latest/Object-To-Object-Mapping对象到对象映射将对象映射到另一个对象是常用并且繁琐重复的工作,大部分情况下两个类都具有相同或相似的属性.例如下面的 应用服务方法:publicclassUserAppService:Applicati......
  • org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps
    org.apache.ibatis.executor.ExecutorException:AquerywasrunandnoResultMapswerefoundfortheMappedStatement'com.xxxx.mapper.EmployeeMapper.selectBybelongweeknull'. It'slikelythatneitheraResultTypenoraResultMapwasspeci......
  • mapreduce
     MapReduce是一种分布式计算模型,用于处理大规模数据集的并行计算。它是由Google首先提出,并在ApacheHadoop项目中得到广泛实现和应用的MapReduce模型的优势在于它的可扩展性和容错性。它可以在大规模的计算集群上并行处理数据,提供高性能和高可靠性。MapReduce适用于各种数据处......
  • 由于string不能输入空格,和cin不能输入空格;用了map和vector和cin.get()的题;本题都正确
    1.cin是C++中最常用的输入语句,当遇到空格或者回车键即停止。无法解决。2.cin.get()函数可以接收空格,遇回车结束输入。3.string也不能输入空格给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。输入格式:输......
  • 16、MapReduce的基本用法示例-自定义序列化、排序、分区、分组和topN
    文章目录Hadoop系列文章目录一、pom.xml与测试数据说明、日志配置1、pom.xml2、数据字段说明3、日志配置二、序列化1、需求2、实现说明3、实现1)、bean2)、Mapper3)、Reducer4)、Driver4、验证三、排序1、需求2、实现说明3、实现1)、bean2)、Mapper3)、Reducer4)、Driver4、验证四、分区1......
  • 15、MapReduce介绍及wordcount
    文章目录Hadoop系列文章目录一、mapreduce编程模型1、MapReduce介绍2、MapReduce编程规范3、序列化4、hadoop数据类型5、示例二、wordcount实现1、pom.xml2、Mapper3、Reducer4、Driver5、完整的代码(WordCount)6、Driver推荐写法7、运行结果1)、运行日志2)、运行结果三、运行环境介绍......
  • 14、HashMap(下)
    内容来自王争Java编程之美上一节,我们介绍了HashMap的底层实现原理,其中提到2个特殊的值,一个是链表树化阈值8,另一个是默认装载因子0.75,本节我们就继续深入分析一下这两个特殊值的由来1、默认装载因子上一节中,我们讲到,装载因子的默认值为0.75,那么0.75这个值是从何而......
  • Import maps
    当 ESModule 最开始作为一种新的 JavaScript 模块化方案在 ES6 中被引入的候,其实是通过在 import 语句中强制指定相对路径或绝对路径来实现的。import dayjs from "https://cdn.skypack.dev/[email protected]"; // ES modulesconsole.log(dayjs("2022-08-12").form......