自定义BeanUtils

自定义BeanUtils工具类,代码如下

package com.chinayanghe.fico.utils;

import cn.com.bizunited.cp.common.utils.FastJsonUtils;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.beans.factory.annotation.Value;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyBeanUtils extends BeanUtils {
	
	/**
	 * 转换为对象对应的map K为字段名,V为值
	 *
	 * @param obj 需要转换的对象
	 * @return 返回对应map
	 */
	public static Map ConvertObjToMap(Object obj){
		Map<String,String> reMap = new HashMap<String,String>();
		if (obj == null){
			return null;
		}
		Field[] fields = obj.getClass().getDeclaredFields();
		try {
			for(int i=0;i<fields.length;i++){
				try {
					Field f = obj.getClass().getDeclaredField(fields[i].getName());
					f.setAccessible(true);
					Object o = f.get(obj);
					if(o!=null){
						if(o instanceof ArrayList){
							reMap.put(fields[i].getName(), FastJsonUtils.toJson(o));
						}else{
							reMap.put(fields[i].getName(), o.toString());
						}
					}
				} catch (NoSuchFieldException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return reMap;
	}
	
	/**
	 * 根据源对象为新对象赋值
	 * 
	 * @param databean 源对象
	 * @param tobean 目标对象
	 */
	public static void copyBeanNotNull2Bean(Object databean, Object tobean){
		PropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(databean);

		for(int i = 0; i < origDescriptors.length; ++i) {
			String name = origDescriptors[i].getName();
			if(!"class".equals(name) && PropertyUtils.isReadable(databean, name) && PropertyUtils.isWriteable(tobean, name)) {
				try {
					Object value = PropertyUtils.getSimpleProperty(databean, name);
					if(isNotEmpty(value)) {
						copyProperty(tobean, name, value);
					}
				} catch (IllegalArgumentException var6) {
					;
				} catch (Exception var7) {
					;
				}
			}
		}
	}
	
	/**
	 * 判断对象是否为空
	 * 
	 * @param str 需要判断的对象
	 * @return
	 */
	public static boolean isNotEmpty(Object str) {
		boolean flag = true;
		if(str != null && !str.equals("")) {
			if(str.toString().length() > 0) {
				//doNonthing
			}
		} else {
			flag = false;
		}

		return flag;
	}

    public static boolean isEmpty(Object str) {
		return !isNotEmpty(str);
    }

	/**
	 * 复制名称相同类型相同字段的值
	 *
	 * @param obj
	 * @param clazz2
	 * @param <T1>
	 * @param <T2>
	 * @return
	 */
	public static <T1, T2> T2 copyData(T1 obj, Class<T2> clazz2) {
		//1. 获取源数据的类
		Class clazz1 = obj.getClass();
		//2. 创建一个目标数据实例
		final T2 obj2 = getInstance(clazz2);

		//3. 获取clazz1和clazz2中的属性
		Field[] fields1 = clazz1.getDeclaredFields();
		Field[] fields2 = clazz2.getDeclaredFields();
		//4. 遍历fields2
		for (Field f1 : fields1) {
			//4-1. 遍历fields1,逐字段匹配
			for (Field f2 : fields2) {
				// 复制字段
				copyField(obj, obj2, f1, f2);
			}
		}
		return obj2;
	}


	public static <T> List<T> copyData1(List<Map<String, String>> list, Class<T> clazz) {
		List<T> objList = new ArrayList<>();
		Field[] fields = clazz.getDeclaredFields();
		for(Map<String, String> m:list){
			final T obj = getInstance(clazz);
			for (Field field : fields) {
				System.out.println(field);
				if(field.isAnnotationPresent(Value.class)){
					Value va = field.getAnnotation(Value.class);
					field.setAccessible(true);
					try {
						if(field.getType()==BigDecimal.class){
							field.set(obj, new BigDecimal(m.get(va.value())));
						}if((field.getType()==Integer.class)||field.getType()==int.class){
							field.set(obj, new Integer(m.get(va.value())));
						}if((field.getType()==Long.class)||field.getType()==long.class){
							field.set(obj, new Long(m.get(va.value())));
						}if((field.getType()==Short.class)||field.getType()==short.class){
							field.set(obj, new Short(m.get(va.value())));
						}if((field.getType()==Byte.class)||field.getType()==byte.class){
							field.set(obj, new Byte(m.get(va.value())));
						}if((field.getType()==Boolean.class)||field.getType()==boolean.class){
							field.set(obj, new Boolean(m.get(va.value())));
						}else{
							field.set(obj, m.get(va.value()));
						}

					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
					field.setAccessible(false);
				}
			}
			objList.add(obj);
		}

		return objList;
	}

	/**
	 * 按照字段表复制相同名称相同类型的字段的值
	 *
	 * @param obj
	 * @param clazz2
	 * @param fieldNames
	 * @param <T1>
	 * @param <T2>
	 * @return
	 */
	public static <T1, T2> T2 copyData(T1 obj, Class<T2> clazz2, String[] fieldNames) {
		//1. 获取源数据的类
		Class clazz1 = obj.getClass();//源数据类
		//2. 创建一个目标数据实例
		final T2 obj2 = getInstance(clazz2);

		//3. 获取clazz1和clazz2中的属性
		Field[] fields1 = clazz1.getDeclaredFields();
		Field[] fields2 = clazz2.getDeclaredFields();

		//4. 遍历字段列表
		for (String fieldName : fieldNames) {
			//5. 遍历fields1
			for (Field f1 : fields1) {
				//找到这个字段(找不到就不用遍历fields2)
				if (fieldName.equals(f1.getName())) {
					//5-1. 遍历fields2,逐字段匹配
					for (Field f2 : fields2) {
						//在fields2中也要有这个字段
						if (fieldName.equals(f2.getName())) {
							//复制字段
							copyField(obj, obj2, f1, f2);
						}
					}
				}
			}
		}
		return obj2;
	}

	/**
	 * 复制相同名称相同类型的字段的值
	 *
	 * @param obj
	 * @param obj2
	 * @param f1
	 * @param f2
	 * @param <T1>
	 * @param <T2>
	 */
	private static <T1, T2> void copyField(T1 obj, T2 obj2, Field f1, Field f2) {
		try {
			//字段名要相同,字段类型也要相同
			if (f1.getName().equals(f2.getName())
					& f1.getType().isAssignableFrom(f2.getType())) {
//				System.out.println(f1.getName());
				//3-2. 获取obj这个字段的值
				f1.setAccessible(true);
				Object val = f1.get(obj);
				//3-3. 把这个值赋给obj2这个字段
				f2.setAccessible(true);
				f2.set(obj2, val);
				//3-4. 访问权限还原
				f2.setAccessible(false);
				f1.setAccessible(false);
			}
		} catch (IllegalAccessException e) {
//			e.printStackTrace();
		}
	}

	/**
	 * 获得泛型类的实例
	 *
	 * @param tClass
	 * @param <T>
	 * @return
	 */
	public static <T> T getInstance(Class<T> tClass) {
		try {
			T t = tClass.newInstance();
			return t;
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return null;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪撞地球QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值