Java bean 和 Map<String,Object> 互转工具类

本贴最后更新于 2015 天前,其中的信息可能已经时移世易

好多都不符合业务需求自己手写了个

package com.xxx.xxx.commons.util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: imle0n
 * @Date: 18-12-14 11:27
 * @Description: javaBean 和 Map 的互转
  */
public class BeanMapTransUtil {

  public static Map<String, Object> tranferBean2Map(Object obj) throws Exception {
  //obj为空,结束方法
  if (obj == null) {
  return null;
  }

  Map<String, Object> map = new HashMap<String, Object>();
  /* Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法。
 * java的自省机制
 * */  BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
  PropertyDescriptor[] ps = beanInfo.getPropertyDescriptors();
  for (PropertyDescriptor propertyDescriptor : ps) {
  String key = propertyDescriptor.getName();

  if (!"class".equals(key)) {
  Method getter = propertyDescriptor.getReadMethod();
  Object value = getter.invoke(obj);
  map.put(key, value);
  }
 }  return map;
  }

  public static  T transferMap2Bean(Class clazz, Map map) throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
  //获取类属性
  BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
  T obj = clazz.newInstance();
  // 给 JavaBean 对象的属性赋值
  PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
  for (int i = 0; i < propertyDescriptors.length; i++) {
  PropertyDescriptor descriptor = propertyDescriptors[i];
  String propertyName = descriptor.getName();

  if (map.containsKey(propertyName)) {
  // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
  Object value = map.get(propertyName);

  Object[] args = new Object[1];
  args[0] = value;
  Field privateField = getPrivateField(propertyName, clazz);
  if (privateField == null) {
 } privateField.setAccessible(true);
  String type = privateField.getGenericType().toString();
  if ("class java.lang.String".equals(type)) {
  if (value == null) {
 privateField.set(obj, null);
  } else {
 privateField.set(obj, value);
  }

 } else if ("class java.lang.Boolean".equals(type)) {
  if (value == null) {
 privateField.set(obj, null);
  } else {
 privateField.set(obj, Boolean.parseBoolean(String.valueOf(value)));
  }
 } else if ("class java.lang.Long".equals(type)) {
  if (value == null) {
 privateField.set(obj, null);
  } else {
 privateField.set(obj, Long.parseLong(String.valueOf(value)));
  }

 } else if ("class java.lang.Integer".equals(type)) {
  if (value == null) {
 privateField.set(obj, null);
  } else {
 privateField.set(obj, Integer.parseInt(String.valueOf(value)));
  }

 } else if ("class java.lang.Double".equals(type)) {
  if (value == null) {
 privateField.set(obj, null);
  } else {
 privateField.set(obj, Double.parseDouble(String.valueOf(value)));
  }

 } else if ("class java.lang.Float".equals(type)) {
  if (value == null) {
 privateField.set(obj, null);
  } else {
 privateField.set(obj, Float.parseFloat(String.valueOf(value)));
  }

 } else if ("class java.math.BigDecimal".equals(type)) {
  if (value == null) {
 privateField.set(obj, null);
  } else {
 privateField.set(obj, new BigDecimal(String.valueOf(value)));
  }

 }//可继续追加类型
  }
 }  return obj;
  }

  /*拿到反射父类私有属性*/
  private static Field getPrivateField(String name, Class cls) {
  Field declaredField = null;
  try {
 declaredField = cls.getDeclaredField(name);
  } catch (NoSuchFieldException ex) {

  if (cls.getSuperclass() == null) {
  return declaredField;
  } else {
 declaredField = getPrivateField(name, cls.getSuperclass());
  }
 }  return declaredField;
  }

}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 52 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 1 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 708 关注
  • V2Ray
    1 引用 • 15 回帖
  • OnlyOffice
    4 引用 • 15 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 632 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 442 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 19 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖 • 4 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 356 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    87 引用 • 1206 回帖 • 449 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 711 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 517 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 147 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 8 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 477 关注
  • 反馈

    Communication channel for makers and users.

    124 引用 • 907 回帖 • 210 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖