java中map和对象互转工具类的实现示例

在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map和对象的互转,但这里,我想通过反射的方式对他们做转化,也算是对反射的学习和研究吧;

1、map转对象;

主要思路,将map中的key-value取出来,然后和给定的对象去匹配,为了使工具方法更具通用性,直接通过反射的方式将给定对象的属性获取到,然后调用反射相关的API和map中的key-value进行匹配即可,下面直接上代码,

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

/**

     * 利用反射将map集合封装成bean对象

     *

     * @param params

     * @param clazz

     * @return

     */

    public static <T> T mapToBean(Map<String, Object> map, Class<?> clazz) throws Exception {

        Object obj = clazz.newInstance();

        if (map != null && !map.isEmpty() && map.size() > 0) {

            for (Map.Entry<String, Object> entry : map.entrySet()) {

                String propertyName = entry.getKey();   // 属性名

                Object value = entry.getValue();        // 属性值

                String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);

                Field field = getClassField(clazz, propertyName);   //获取和map的key匹配的属性名称

                if (field == null){

                    continue;

                }

                Class<?> fieldTypeClass = field.getType();

                value = convertValType(value, fieldTypeClass);

                try {

                    clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);

                } catch (NoSuchMethodException e) {

                    e.printStackTrace();

                }

            }

        }

        return (T) obj;

    }

    /**

     * 根据给定对象类匹配对象中的特定字段

     * @param clazz

     * @param fieldName

     * @return

     */

    private static Field getClassField(Class<?> clazz, String fieldName) {

        if (Object.class.getName().equals(clazz.getName())) {

            return null;

        }

        Field[] declaredFields = clazz.getDeclaredFields();

        for (Field field : declaredFields) {

            if (field.getName().equals(fieldName)) {

                return field;

            }

        }

        Class<?> superClass = clazz.getSuperclass();  //如果该类还有父类,将父类对象中的字段也取出

        if (superClass != null) {                       //递归获取

            return getClassField(superClass, fieldName);

        }

        return null;

    }

    /**

     * 将map的value值转为实体类中字段类型匹配的方法

     * @param value

     * @param fieldTypeClass

     * @return

     */

    private static Object convertValType(Object value, Class<?> fieldTypeClass) {

        Object retVal = null;

        

        if (Long.class.getName().equals(fieldTypeClass.getName())

                || long.class.getName().equals(fieldTypeClass.getName())) {

            retVal = Long.parseLong(value.toString());

        } else if (Integer.class.getName().equals(fieldTypeClass.getName())

                || int.class.getName().equals(fieldTypeClass.getName())) {

            retVal = Integer.parseInt(value.toString());

        } else if (Float.class.getName().equals(fieldTypeClass.getName())

                || float.class.getName().equals(fieldTypeClass.getName())) {

            retVal = Float.parseFloat(value.toString());

        } else if (Double.class.getName().equals(fieldTypeClass.getName())

                || double.class.getName().equals(fieldTypeClass.getName())) {

            retVal = Double.parseDouble(value.toString());

        } else {

            retVal = value;

        }

        return retVal;

    }

我们写一个测试方法来验证一下上述代码,我提前建好了一个实体类productInfo,

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

public class ProductInfo {

    

    private Long id;

    private String name;

    private Double price;

    public Long getId() {

        return id;

    }

    public void setId(Long id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public Double getPrice() {

        return price;

    }

    public void setPrice(Double price) {

        this.price = price;

    }

    

    public ProductInfo(Long id, String name, Double price) {

        super();

        this.id = id;

        this.name = name;

        this.price = price;

    }

    

    public ProductInfo() {

        super();

    }

    

    @Override

    public String toString() {

        return "ProductInfo [id=" + id + ", name=" + name + ", price=" + price + "]";

    }

}

?


1

2

3

4

5

6

7

8

public static void main(String[] args) throws Exception {

        Map<String, Object> param = new HashMap<>();

        param.put("id", 12232);

        param.put("name", "banana");

        param.put("price", 12.25);

        ProductInfo info = mapToBean(param, ProductInfo.class);

        System.out.println(info.getName());

    }

运行main函数,查看结果,可以看到控制台已经成功打印出结果,

2、对象转map,

思路,同上述的分析类似,这不过这里需要反过来,给定一个待转化的实体类,通过反射,将实体类中的字段名称和字段值获取到,然后一一设置到map的key-value中,下面看代码,

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

/**

     * 对象转map

     * @param obj

     * @return

     */

    private static Map<String, Object> objToMap(Object obj) {

        Map<String, Object> map = new HashMap<String, Object>();

        Field[] fields = obj.getClass().getDeclaredFields();    // 获取f对象对应类中的所有属性域

        for (int i = 0, len = fields.length; i < len; i++) {

            String varName = fields[i].getName();

            varName = varName.toLowerCase();                    // 将key置为小写,默认为对象的属性

            try {

                boolean accessFlag = fields[i].isAccessible();  // 获取原来的访问控制权限

                fields[i].setAccessible(true);                  // 修改访问控制权限

                Object o = fields[i].get(obj);                  // 获取在对象f中属性fields[i]对应的对象中的变量

                if (o != null){

                    map.put(varName, o.toString());

                }

                fields[i].setAccessible(accessFlag);            // 恢复访问控制权限

            } catch (IllegalArgumentException ex) {

                ex.printStackTrace();

            } catch (IllegalAccessException ex) {

                ex.printStackTrace();

            }

        }

        return map;

    }

下面写个测试方法,

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public static void main(String[] args) throws Exception {

        Map<String, Object> param = new HashMap<>();

        param.put("id", 12232);

        param.put("name", "banana");

        param.put("price", 12.25);

        ProductInfo info = mapToBean(param, ProductInfo.class);

        System.out.println(info.getName());

        

        System.out.println("---------------------");

        

        Map<String, Object> map = objToMap(info);

        

        System.out.println("对象转map后的结果 : " + map);

    }

运行,查看控制台的输出结果,说明已经成功转化,

以上,就是map和对象之间实现互相转化的工具类,各位今后工作中如有需要可直接拿去使用,不足之处,敬请见谅哈!也希望大家多多支持脚本之家。

https://blog.csdn.net/u011191463/article/details/60579191

https://blog.csdn.net/qq_22596931/article/details/86637540

https://www.jb51.net/article/167715.htm

原文地址:https://www.cnblogs.com/leijiangtao/p/12076110.html

时间: 2024-10-09 07:43:04

java中map和对象互转工具类的实现示例的相关文章

java中Map等对象转换为json

ObjectMapper objectMapper = new ObjectMapper(); String jsonString = objectMapper.writeValueAsString(Object)://Object, 实体对象

总结的一些json格式和对象/String/Map/List等的互转工具类

原文:总结的一些json格式和对象/String/Map/List等的互转工具类 源代码下载地址:http://www.zuidaima.com/share/1550463691508736.htm 总结的一些json格式和对象/String/Map/List等的互转工具类,有需要的可以看看,需要引入jackson-core-asl-1.7.1.jar.jackson-jaxrs-1.7.1.jar.jackson-mapper-asl-1.7.1.jar这三个jar包 package com.

细说java中Map的两种迭代方式

以前对java中迭代方式总是迷迷糊糊的,今天总算弄懂了,特意的总结了一下,基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代访问)Collection集合中的元素,Iterator也称为迭代器.它仅仅只有三个方法:hasNext(),next()和remove() hasNext():如果仍有元素可以迭代,则返回 true.(换句话说,如果 next 返回了元素而不是 抛出异常,则返回 true). next():返回迭代的下一个元素. re

Java中字节与对象之间的转换

近期公司里面用到了消息队列,而正如我们知道的是消息队列之间的是通过二进制形式的.以下就分享一下java中字节与对象之间的转换. 主要是用到了ByteArrayOutputStream和ObjectOutputStream两个输出流,以及ByteArrayInputStream和ObjectInputStream两个输入流. 废话不多说了,直接上代码吧! /** * @FileName: ByteToObject.java * @Package:com.test * @Description: T

java中Map,List与Set的区别

java中Map,List与Set的区别 目录(?)[+] Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 简单说下集合和数组的区别:(参考文章:

Java中Map相关的快速查找算法与唯一性(转载)

原文地址:http://blog.csdn.net/chuyuqing/article/details/19629229 在对<Set和hashCode()>的一篇原创文章写完后,由于对自己的一些论断产生了模糊和怀疑,因此又对Set进行了一些研究,形成本篇. 在Set的使用场景中,我们不外乎看中了她存储数据的唯一性,即不能存储重复值,这在某些应用场合下是很必要的一个特性.那么从更深一层来考虑,Set究竟如何使数据不重复的呢?从另一个层面来考虑,她又如何确保在验证数据是否重复过程中的快速性呢?假

探究Java中Map类

Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.       Map的接口       Map---实现Map       Map.Entry--Map的内部类,描述Map中的按键/数值对.       SortedMap---扩展Map,使按键保持升序排列           关于怎么使用,一般是选择Map的子类,而不直接用Map类.       下面以HashMap为例.       public     static     void     ma

Jackson 对象与json数据互转工具类JacksonUtil

1,User对象 package com.st.json; import java.util.Date; /** * @Description: JSON序列化和反序列化使用的User类 * @author Mr.Li * @date 2018年4月21日 下午10:55:34 */ public class User { private Integer id; private String name; private Integer age; private Date birthday; pr

Java中List&lt;E&gt;对象赋值问题(深浅拷贝)

Java中List<E>对象赋值操作问题 业务需求是:取2个集合中的交集对象并返回.如下代码,busMap中key值和stocks中Map中的key值相等的对象则返回继续操作,也就是说剔除stocks中的不存在于busMap中的对象,就是一个过滤操作. 实现代码 ① bug版报错:java.util.ConcurrentModificationException ; at java.util.ArrayList$Itr.checkForComodification(ArrayList.java