对象转map工具类BeanUtil

对象转map工具类BeanUtil1、2、当isAccessible()的结果是false时不允许通过反射访问private变量。packagecom.yung.ppapi.util;importjava.beans.BeanInfo;importjava.beans.Introspector;importjava.beans.PropertyDescriptor;importjava.lang.re…

大家好,又见面了,我是你们的朋友全栈君。

1、

2、当isAccessible()的结果是false时不允许通过反射访问private变量。

package com.yung.ppapi.util;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanMap;
import org.springframework.beans.BeanUtils;

import com.yung.ppapi.integration.dto.YCPFExpressDTO;

/**
 * 
 * @author lisheng4
 *
 */
public class BeanUtil {
	
    public static <T> T clone(Object source, Class<T> type) {
        try {
        	if (source == null) {
        		return null;
        	}
            T target = type.newInstance();
            BeanUtils.copyProperties(source, target);
            return target;
        } catch (Exception e) {
        	e.printStackTrace();
            return null;
        } 
    } 
    public static <T> T clone(Object source, Class<T> type, String... ignoreProperties) {
        try {
        	if (source == null) {
        		return null;
        	}
            T target = type.newInstance();
            BeanUtils.copyProperties(source, target, ignoreProperties);
            return target;
        } catch (Exception e) {
        	e.printStackTrace();
            return null;
        } 
    } 
	
	/**
	 * 利用反射实现
	 * @param map
	 * @param beanClass
	 * @return
	 * @throws Exception
	 */
	public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
		if (map == null) {
			return null;
		}

		Object obj = beanClass.newInstance();

		Field[] fields = obj.getClass().getDeclaredFields();
		for (Field field : fields) {
			int mod = field.getModifiers();
			if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
				continue;
			}
			
			boolean accessFlag = field.isAccessible();
			field.setAccessible(true);// 允许通过反射访问该字段
			field.set(obj, map.get(field.getName()));
			field.setAccessible(accessFlag);
		}

		return obj;
	}
	
	/**
	 * 利用反射实现
	 * <li>空属性不转换
	 * <li>超过10万条数据不建议使用
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static Map<String, Object> objectToMap(Object obj) throws Exception {

		if (obj == null) {
			return null;
		}

		Map<String, Object> map = new HashMap<String, Object>();
		Field[] fields = obj.getClass().getDeclaredFields();
		for (int i = 0, len = fields.length; i < len; i++) {
			String varName = fields[i].getName();
			boolean accessFlag = fields[i].isAccessible();
			fields[i].setAccessible(true);// 允许通过反射访问该字段

			Object valueObj = fields[i].get(obj);
			if (valueObj != null) {
				map.put(varName, valueObj);
			}
			fields[i].setAccessible(accessFlag);
		}
		return map;
	}
	
	/**
	 * 利用java.beans.Introspector实现
	 * @param map
	 * @param beanClass
	 * @return
	 * @throws Exception
	 */
	public static Object mapToObject2(Map<String, Object> map, Class<?> beanClass) throws Exception {    
	    if (map == null)
	        return null;    

	    Object obj = beanClass.newInstance();  

	    BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());    
	    PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();    
	    for (PropertyDescriptor property : propertyDescriptors) {  
	        Method setter = property.getWriteMethod();    
	        if (setter != null) {  
	            setter.invoke(obj, map.get(property.getName()));   
	        }  
	    }  
	    return obj;  
	}    
	 
	/**
	 * 利用java.beans.Introspector实现
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static Map<String, Object> objectToMap2(Object obj) throws Exception {    
	    if(obj == null)  
	        return null;      

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

	    BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());    
	    PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();    
	    for (PropertyDescriptor property : propertyDescriptors) {    
	        String key = property.getName();    
	        if (key.compareToIgnoreCase("class") == 0) {   
	            continue;  
	        }  
	        Method getter = property.getReadMethod();  
	        Object value = getter!=null ? getter.invoke(obj) : null;  
	        map.put(key, value);  
	    }    

	    return map;  
	} 
	
	/**
	 * 利用org.apache.commons.beanutils.BeanUtils实现
	 * @param map
	 * @param beanClass
	 * @return
	 * @throws Exception
	 */
	public static Object mapToObject3(Map<String, Object> map, Class<?> beanClass) throws Exception {    
	    if (map == null)  
	        return null;  

	    Object obj = beanClass.newInstance();  
	    org.apache.commons.beanutils.BeanUtils.populate(obj, map);  
	    return obj;  
	}    
	 
	/**
	 * 利用org.apache.commons.beanutils.BeanMap实现
	 * @param obj
	 * @return
	 */
	public static Map<?,?> objectToMap3(Object obj) {  
	    if(obj == null)  
	        return null;   

	    return new BeanMap(obj);  
	} 

	
//	public static void main(String[] args) throws Exception {
//		List<Map<String,Object>> mapList = new ArrayList<Map<String,Object>>();
//		List<Map<String,Object>> mapList2 = new ArrayList<Map<String,Object>>();
//		List<Map<String,Object>> mapList3 = new ArrayList<Map<String,Object>>();
//		long t11 = System.currentTimeMillis();
//		for(int i=1;i<=100000;i++) {
//			mapList.add(objectToMap(new YCPFExpressDTO()));
//		}
//		long t12 = System.currentTimeMillis();
//		
//		long t21 = System.currentTimeMillis();
//		for(int i=1;i<10000;i++) {
//			mapList2.add((Map<String, Object>) objectToMap2(new YCPFExpressDTO()));
//		}
//		long t22 = System.currentTimeMillis();
//		
//		long t31 = System.currentTimeMillis();
//		for(int i=1;i<10000;i++) {
//			mapList3.add((Map<String, Object>) objectToMap3(new YCPFExpressDTO()));
//		}
//		long t32 = System.currentTimeMillis();
//		System.out.println(t12-t11);
//		System.out.println(t22-t21);
//		System.out.println(t32-t31);
//		//System.out.println(t32-t31);
//	}

}

 

 

参考文章:https://www.cnblogs.com/XuYiHe/p/6871799.html

参考文章:https://blog.csdn.net/o_nianchenzi_o/article/details/78022416

 

 

楼主这么辛苦,请使用楼主的推荐码领取支付宝红包吧,记得一定要消费掉哦。双赢^_^。

1、打开支付宝首页搜索“8282987” 立即领红包。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145337.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《架构之美》笔记_印象笔记如何创建目录

    《架构之美》笔记_印象笔记如何创建目录美是创造矛盾并解决矛盾。架构的多关注点(例如业务逻辑、系统扩展性、持久、并发)和简洁性就是一种矛盾,美丽的架构能解决这种矛盾,使人内心产生愉悦;随着关注点的增加,架构也在不断演进;术:分层、组件化、服务化、标准化、缓存、分离、队列、复制、冗余、代理;道:如何恰到好处地使用术,例如顿悟变化的道理、博弈中寻找平衡、相对与绝对的奥秘、开放的心态;爱因斯坦说:『让它尽可能简单,但不要过于简单』,美

    2025年6月10日
    5
  • c++和java哪个好学_C/C++,JAVA学习哪个更容易就业?

    c++和java哪个好学_C/C++,JAVA学习哪个更容易就业?C、C++和Java语言都是目前在IT行业内有广泛使用的编程语言,其中C的应用场景主要集中在嵌入式开发、操作系统开发等领域,C++主要的应用领域集中在多媒体和容器开发领域,而Java的应用场景更多一些,包括Web开发、移动互联开发、大数据开发等。从市场需求量来看,目前Java程序员的市场需求量更大一些。C语言可以说是编程语言界的常青树,虽然已经被使用多年,但是目前依然具有旺盛的生命力,尤其在一些…

    2022年7月7日
    32
  • cxf实现webservice_产品框架

    cxf实现webservice_产品框架1.WebService与CXF简介1.1WebServiceWebService是一种跨编程语言和跨操作系统平台的远程调用技术。跨编程语言和跨操作平台就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。远程调用就是一台计算机a上的…

    2025年12月11日
    3
  • Java1.8安装详细教程[通俗易懂]

    Java1.8安装详细教程[通俗易懂]JavaJDK安装与配置1、下载官网地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html(1)点击DOWNLOAD(2)选择相应版本、因为我的是windows64位所以选择最下方的390.25MB的版本(3)下载后一直点击下一步就好了ps:路径不喜欢安装在C盘的可以选择…

    2022年7月16日
    13
  • Python – __name__==’__main__’是干啥的,以及python -m与python的区别

    Python – __name__==’__main__’是干啥的,以及python -m与python的区别转自牛人: https://www.cnblogs.com/ddzj01/p/10919210.html1.__name__=='__main__'是干啥的先看例子,准

    2022年7月5日
    32
  • 进制转换python实验五_python进制转换:十进制转二进制的用法「建议收藏」

    进制转换python实验五_python进制转换:十进制转二进制的用法「建议收藏」我们在学习python时候肯定会碰到关于进制转换,其实这是非常简单的,这个就像小学学习数学乘法口诀意义,只要记住转换口诀即可轻松应用,一起来看下具体的操作内容吧~一、python进制转换dec(十进制)—>bin(二进制)dec(十进制)—>oct(八进制)dec(十进制)—>hex(十六进制)二、十进制我们所熟知的十进制,其实是从0开始,数到9之后,就跳到10,…

    2022年5月19日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号