对象之间的强制转化



package com.zuk.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class ObjectUtil {
	/**
	 * 利用反射实现对象之间属性复制
	 * 
	 * @param from
	 * @param to
	 */
	public static Object copyProperties(Object from, Object to) throws Exception {
		return copyPropertiesExclude(from, to, null);
	}

	/**
	 * @throws Exception 
	 * @author 180121
	 * @param from   
	 * @param to
	 * @return to 
	 * @function  将from中非空属性赋值to对象中
	 * */
	public static Object copyPropertiesValueIsNull(Object from, Object to) throws Exception{
		Method[] fromMethods = from.getClass().getDeclaredMethods();
		Method fromMethod = null;
		String lists = "";
		for (int i = 0; i < fromMethods.length; i++) {
			fromMethod = fromMethods[i];
			String fromMethodName = fromMethod.getName();
			if (!fromMethodName.contains("get")){
				continue;
			}
			fromMethodName = fromMethodName.replace("get", "");
			char c = fromMethodName.charAt(0);
			String cc = (c+"").toLowerCase();//一般都是首字符小写
			fromMethodName = cc+fromMethodName.substring(1);
			Class fromCls = fromMethod.getReturnType();
			Object value = fromMethod.invoke(from, new Object[0]);
			if (value == null){
				continue;
			}
			if (value instanceof Collection) {
				Collection newValue = (Collection) value;
				if (newValue.size() <= 0){
					continue;
				}
			}
			if(value==null){
				lists = fromMethodName.trim()+";";
			}
		}
		String strs[] = lists.split(";");
		ObjectUtil.copyPropertiesExclude(from, to, strs);
		return to;
	}
	
	
	/**
	 * 复制对象属性
	 * 
	 * @param from
	 * @param to
	 * @param excludsArray
	 *            排除属性列表
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static Object copyPropertiesExclude(Object from, Object to,
			String[] excludsArray) throws Exception {
		List<String> excludesList = null;
		if (excludsArray != null && excludsArray.length > 0) {
			excludesList = Arrays.asList(excludsArray); // 构造列表对象
		}
		Method[] fromMethods = from.getClass().getDeclaredMethods();
		Method[] toMethods = to.getClass().getDeclaredMethods();
		
		
		Method fromMethod = null, toMethod = null;
		String fromMethodName = null, toMethodName = null;
		
		for (int i = 0; i < fromMethods.length; i++) {
			fromMethod = fromMethods[i];
			fromMethodName = fromMethod.getName();
			
			System.out.println(fromMethodName);
			
			if (!fromMethodName.contains("get"))
				continue;
			// 排除列表检测
			if (excludesList != null
					&& excludesList.contains(fromMethodName.substring(3)
							.toLowerCase())) {
				continue;
			}
			
			toMethodName = "set" + fromMethodName.substring(3);
			toMethod = findMethodByName(toMethods, toMethodName);
			if (toMethod == null)
				continue;
			
			Class toCls = toMethod.getParameterTypes()[0], fromCls = fromMethod.getReturnType();
			
			Object value = fromMethod.invoke(from, new Object[0]);
			if (value == null)
				continue;
			// 集合类判空处理
			if (value instanceof Collection) {
				Collection newValue = (Collection) value;
				if (newValue.size() <= 0)
					continue;
			}
			
			
			value = convert(fromCls, toCls, value);
			
			toMethod.invoke(to, new Object[] { value });
			
		}
		
		return to;
	}

	/**
	 * 对象属性值复制,仅复制指定名称的属性值
	 * 
	 * @param from
	 * @param to
	 * @param includsArray
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static void copyPropertiesInclude(Object from, Object to,
			String[] includsArray) throws Exception {
		List<String> includesList = null;
		if (includsArray != null && includsArray.length > 0) {
			includesList = Arrays.asList(includsArray); // 构造列表对象
		} else {
			return;
		}
		Method[] fromMethods = from.getClass().getDeclaredMethods();
		Method[] toMethods = to.getClass().getDeclaredMethods();
		Method fromMethod = null, toMethod = null;
		String fromMethodName = null, toMethodName = null;
		for (int i = 0; i < fromMethods.length; i++) {
			fromMethod = fromMethods[i];
			fromMethodName = fromMethod.getName();
			if (!fromMethodName.contains("get"))
				continue;
			// 排除列表检测
			String str = fromMethodName.substring(3);
			if (!includesList.contains(str.substring(0, 1).toLowerCase()
					+ str.substring(1))) {
				continue;
			}
			toMethodName = "set" + fromMethodName.substring(3);
			toMethod = findMethodByName(toMethods, toMethodName);
			if (toMethod == null)
				continue;
			
			Class toCls = toMethod.getParameterTypes()[0], fromCls = fromMethod.getReturnType();
			
			Object value = fromMethod.invoke(from, new Object[0]);
			if (value == null)
				continue;
			// 集合类判空处理
			if (value instanceof Collection) {
				Collection newValue = (Collection) value;
				if (newValue.size() <= 0)
					continue;
			}
			
			value = convert(fromCls, toCls, value);
			toMethod.invoke(to, new Object[] { value });
		}
	}

	/**
	 * 从方法数组中获取指定名称的方法
	 * 
	 * @param methods
	 * @param name
	 * @return
	 */
	private static Method findMethodByName(Method[] methods, String name) {
		for (int j = 0; j < methods.length; j++) {
			if (methods[j].getName().equalsIgnoreCase(name))
				return methods[j];
		}
		return null;
	}
	
	
	private static Object convert(Class fromCls, Class toCls,Object value){
		
		Object _t = null;
		
		if( toCls.equals(java.math.BigDecimal.class) && fromCls.equals(Double.class) ){
			
			//
			// toCls:class java.math.BigDecimal fromCls:class java.lang.Double
			//
			
			Double _f = (Double)value;
			_t = new java.math.BigDecimal(_f);
			
		}else if( toCls.equals(Double.class) && fromCls.equals(java.math.BigDecimal.class) ){
			
			//
			// toCls:class java.lang.Double fromCls:class java.math.BigDecimal
			//
			
			java.math.BigDecimal _f = (java.math.BigDecimal)value;
			_t = _f.doubleValue();
			
		}else if( toCls.equals(java.sql.Date.class) && fromCls.equals(java.sql.Timestamp.class) ){
			
			//
			// toCls:class java.sql.Date fromCls:class java.sql.Timestamp
			//
			
			java.sql.Timestamp _f = (java.sql.Timestamp)value;
			_t = new java.sql.Date(_f.getTime());
			
		}else if( toCls.equals(java.sql.Timestamp.class) && fromCls.equals(java.sql.Date.class) ){
			
			//
			// toCls:class java.sql.Timestamp fromCls:class java.sql.Date
			//
			
			java.sql.Date _f = (java.sql.Date)value;
			_t = new java.sql.Timestamp(_f.getTime());
			
		}else if( toCls.equals(Integer.class) && fromCls.equals(Long.class) ){
			
			//
			// toCls:class Integer fromCls:class Long
			//
			
			Long _f = (Long)value;
			_t = _f.intValue();
			
		}else if( toCls.equals(Long.class) && fromCls.equals(Integer.class) ){
			
			//
			// toCls:class Long fromCls:class Integer
			//
			
			Integer _f = (Integer)value;
			_t = new Long(_f);
			
		}else{
			_t = value;
		}
		
		return _t;
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值