反射獲取屬性名和獲取屬性值

package com.hisense.smartroad.common.util;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.poi.ss.formula.functions.T;

import com.hisense.smartroad.saf.securitymanagement.entity.Bdf2DeptSaf;
import com.hisense.smartroad.saf.securitymanagement.entity.SafTBaseStaff;

/**
 * 反射工具類
 * 
 * @author xl
 * 
 */
public class ReflectUtils {
	private T original; // 原數據
	private T current; // 當前數據
	private static final String YYYY_MM_DD = "yyyy-MM-dd";
	private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd hh:mm:ss";

	private ReflectUtils() {}

	/**
	 * 反射設置屬性和值,用於導出 partten : 時間格式化
	 */
	public static Map<String, Object> setReflectValue(Object obj, String partten) {
		Map<String, Object> map = new HashMap<>();
		try {
			Class clazz = obj.getClass();
			Field[] fs = clazz.getDeclaredFields();
			for (Field field : fs) {
				field.setAccessible(true);// 設置能夠訪問私有方法
				if ("serialVersionUID".equals(field.getName())) {
					continue;
				}
				if (field.getType().equals("Date")) {
					String date = DateFormatUtils.format((Date) field.get(obj),YYYY_MM_DD);
					if (!StringUtils.isEmpty(partten)) {
						date = DateFormatUtils.format((Date) field.get(obj),partten);
					}
					map.put(field.getName(), date);
					continue;
				}
				System.out.println(field.getName() + ":::::::::::::::::::::" + field.get(obj));
				map.put(field.getName(),field.get(obj) == null ? "" : field.get(obj));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return map;
	}
	
	/**
	 * 反射設置屬性和值,用於導出 partten : 時間格式化
	 */
	public static MapEx<String, Object> setReflectValueMapEx(Object obj, String partten) {
		MapEx<String, Object> map = new MapEx<>();
		try {
			Class clazz = obj.getClass();
			Field[] fs = clazz.getDeclaredFields();
			for (Field field : fs) {
				System.out.println(field.getName());
				field.setAccessible(true);// 設置能夠訪問私有方法
				if ("serialVersionUID".equals(field.getName())) {
					continue;
				}

				if (field.getType().getName().equals("com.hisense.smartroad.saf.securitymanagement.entity.Bdf2DeptSaf")) {
					Bdf2DeptSaf dept = (Bdf2DeptSaf)field.get(obj);
					map.put(field.getName(),field.get(obj) == null ? "" : dept.getDesc());
					continue;
				}
				if (field.getType().getName().equals("com.hisense.smartroad.saf.securitymanagement.entity.SafTBaseStaff")) {
					SafTBaseStaff staff = (SafTBaseStaff)field.get(obj);
					map.put(field.getName(),field.get(obj) == null ? "" : staff.getStaffName());
					continue;
				}
				if (field.getType().getName().equals("java.util.Date")) {
					String date = DateFormatUtils.format((Date) field.get(obj),YYYY_MM_DD);
					if (!StringUtils.isEmpty(partten)) {
						date = DateFormatUtils.format((Date) field.get(obj),partten);
					}
					map.put(field.getName(), date);
					continue;
				}
				System.out.println("反射實體:" + field.getName() + "-----------------------------" + field.get(obj));
				map.put(field.getName(),field.get(obj) == null ? "" : field.get(obj));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return map;
	}
	
	/**
	 * 反射獲取倆對象同一屬性的新舊值
	 * oldObj:就對象 
	 * currentObj:當前對象
	 * dealField:需要處理的列
	 */
	public static List<Map<String,Object>> getNewAndOldValue(Object oldObj, Object currentObj,Map<String,Object> dealField){
		List<Map<String,Object>> list = new ArrayList<>();
		try {
			Class<? extends Object> clazz = oldObj.getClass();
		    Field[] fields = clazz.getDeclaredFields();
		    for (Field field : fields) {
		    	if (field.getName().equals("serialVersionUID")) {
					continue;
				}		    	
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(),clazz);
				Method getMethod = pd.getReadMethod();
				String type = field.getType().getName();
				if ("java.util.Set".equals(type)) {
					continue;
				}

				Object old = getMethod.invoke(oldObj);
				Object current = getMethod.invoke(currentObj);
				if (dealField != null) {
					if (dealField.get("compareField").equals(field.getName())) {
						Map<String,Object> map = new HashMap<>();
						map.put("field", field.getName());
						map.put(dealField.get("needField").toString(),currentObj);
						map.put("old", old);
						map.put("current", current);
						list.add(map);
						continue;
					} 
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 反射對比數據值是否發生改變
	 */
	public String contrastObj(Class<T> cls) {
		StringBuilder sb = new StringBuilder();
		try {
			Field[] fields = cls.getDeclaredFields();
			for (Field field : fields) {
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(),cls);
				Method getMethod = pd.getReadMethod();
				String type = field.getType().getName();
				if (!"java.util.Set".equals(type)) {
					Object o1 = getMethod.invoke(this.original);
					Object o2 = getMethod.invoke(this.current);
					if (null != o2) {
						String s1 = o1 == null ? "" : o1.toString();
						String s2 = o2 == null ? "" : o2.toString();
						if (!s1.equals(s2)) {
							System.out.println("不一樣的屬性:" + field.getName() + " 屬性值:[" + s1 + "," + s2 + "]");
							sb.append(field.getName() + ":" + "[" + s1 + "," + s2 + "];");
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}
	
	/**
     * 複製對象屬性(對象類型必須相同)
     * @param orig 資源對象
     * @param dest 目標對象
     * @param clazz 源對象類
     * @param ignoreNull 是否忽略空(true:忽略,false:不忽略)
     * @param ignoreExist  是否只複製dest值爲空的數據  true 是,false 否
     */
    public static <T> T copyProperties(T orig, T dest, Class<?> clazz, boolean ignoreNull,boolean ignoreExist) {
        if (orig == null || dest == null){
        	 return null;
        }          
        if(!clazz.isAssignableFrom(orig.getClass())){
            return null;
        }
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                Object oldValue = field.get(orig);
                Object newValue = field.get(dest);
                System.out.println(field.getName() + "----" + oldValue);
                System.out.println(field + "----" + newValue);
                if(!java.lang.reflect.Modifier.isFinal(field.getModifiers())){
                    if(!(ignoreNull && oldValue == null)){
                        if(ignoreExist && newValue != null){
 
                        }else{
                            field.set(dest, oldValue);
                        }
                    }
                }
                field.setAccessible(false);
            } catch (Exception e) {
            }
        }
 
        if(clazz.getSuperclass() == Object.class){
            return dest;
        }
 
        return copyProperties(orig, dest, clazz.getSuperclass(), ignoreNull,ignoreExist);
    }
    
    

	public T getCurrent() {
		return current;
	}

	public void setCurrent(T current) {
		this.current = current;
	}

	public T getOriginal() {
		return original;
	}

	public void setOriginal(T original) {
		this.original = original;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章