工具类-两个对象比较获取变更的数据
package cn.swiftpass.core.common.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.*;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang.reflect.FieldUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.swiftpass.core.common.annotation.CompareVal;
import cn.swiftpass.core.common.mybatis.handler.CryptTypeHanlderHelper;
import org.springframework.util.ReflectionUtils;
/**
* 机构变更审核工具类
* @author chenys
*
*/
public class OrgModifyExamineUtils {
private static Logger logger = LoggerFactory.getLogger(OrgModifyExamineUtils.class);
public static final String MCH_KEY = "mchInfo";
public static final String MCH_DETAIL_KEY = "mchDetailInfo";
public static final String MCH_BRANCH_CONF_KEY = "mchBranchConfInfo";
public static final String CH_KEY = "chInfo";
public static final String BANK_ACCOUNT_KEY = "bankAccountInfo";
public static final String ACTIVITY_2C_KEY = "activity2CInfo";
/**
* 受益人
*/
public static final String BENEFIT_KEY = "benefit";
public static final String BENEFIT_OREDER_KEY = "benefitOrder";
public static final String MCH_PAY_CONF_RATE_INFO = "mchPayConfRateInfo";
public static final String MCH_PAY_CONF_PRODUCT_INFO = "mchPayConfProductInfo";
public static final String MCH_RANK_LIMIT_RECORD = "mchRankLimitRecord";
private OrgModifyExamineUtils() {}
/**
* 获取变更的数据
* @param newObj
* @param oldObj
* @param annotationClazz
* @return
*/
public static Map<String,Object> getModifyData(Object newObj,Object oldObj,Class<?> annotationClazz,String...specalFields){
if(null == annotationClazz || (null == newObj && null != oldObj) || (null != newObj && null == oldObj)){
return null;
}
else if(newObj.equals(oldObj)){
return null;
}
Map<String, Object> reponseMap = new HashMap<String,Object>();
try{
Class<? extends Object> clazz1 = newObj.getClass();
Class<? extends Object> clazz2 = oldObj.getClass();
for(String specalField:specalFields){
Field field1 = null;
Field field2 = null;
try{
field1 = clazz1.getDeclaredField(specalField);
}catch(Exception e){
try{
field1 = clazz1.getSuperclass().getDeclaredField(specalField);
}catch(Exception e1){
continue;
}
}
ReflectionUtils.makeAccessible(field1);
Object object1 = field1.get(newObj);
try{
field2 = clazz2.getDeclaredField(specalField);
}catch(Exception e){
try{
field2 = clazz2.getSuperclass().getDeclaredField(specalField);
}catch(Exception e1){
continue;
}
}
ReflectionUtils.makeAccessible(field2);
Object object2 = field2.get(oldObj);
if(object1 != null && StringUtils.isNotBlank(object1.toString()) && !JudgeUtils.compareValue(object1,object2)){
reponseMap.put(specalField, object1);
}
}
Field[] clazzFields = annotationClazz.getDeclaredFields();
for(Field clazzfield: clazzFields){
if(clazzfield.isAnnotationPresent(CompareVal.class)){
CompareVal compareValAnn = clazzfield.getAnnotation(CompareVal.class);
if(compareValAnn.value()){
Field field1 = null;
Field field2 = null;
try{
field1 = clazz1.getDeclaredField(clazzfield.getName());
}catch(Exception e){
try{
field1 = clazz1.getSuperclass().getDeclaredField(clazzfield.getName());
}catch(Exception e1){
continue;
}
}
ReflectionUtils.makeAccessible(field1);
Object object1 = field1.get(newObj);
try{
field2 = clazz2.getDeclaredField(clazzfield.getName());
}catch(Exception e){
try{
field2 = clazz2.getSuperclass().getDeclaredField(clazzfield.getName());
}catch(Exception e1){
continue;
}
}
ReflectionUtils.makeAccessible(field2);
Object object2 = field2.get(oldObj);
if(compareValAnn.zeroEqNull()){
if(object1 == null){
object1 = 0;
}
if(object2 == null){
object2 = 0 ;
}
}
if(object1 != null && StringUtils.isNotBlank(object1.toString()) && !JudgeUtils.compareValue(object1,object2)){
if(compareValAnn.doCrypt()){
object1 = CryptTypeHanlderHelper.doEncryptData(String.valueOf(object1), compareValAnn.cryptEnum());
}
reponseMap.put(clazzfield.getName(), object1);
}
}
}
}
return reponseMap;
}catch(Exception e){
return reponseMap;
}
}
/**
* 变更信息审核通过后设置变更数据到实体上
* @param obj 设置数据的对象,空则根据class自动生成对象
* @param newDataMap 需要设置到对象的数据
* @throws Exception
*/
public static Object setModifyDataToEntity(Object obj,Map<String,Object> newDataMap,Class<?> clazz) {
if(obj == null){
try {
obj = clazz.newInstance();
} catch (Exception e) {
logger.error("生成对象失败,{}",e);
return null;
}
}
for(Entry<String, Object> dataInfo:newDataMap.entrySet()){
try{
Object value = dataInfo.getValue();
Field field = null;
try{
field = clazz.getDeclaredField(dataInfo.getKey());
}catch(Exception e){
try{
field = clazz.getSuperclass().getDeclaredField(dataInfo.getKey());
}catch(Exception e1){
continue;
}
}
if(field.getType().toString().equals(Long.class.toString())){
if(dataInfo.getValue() instanceof Integer){
value = ((Integer)dataInfo.getValue()).longValue();
}else if(dataInfo.getValue() instanceof String){
value = Long.parseLong((String)dataInfo.getValue());
}
}else if(field.getType().toString().equals(Integer.class.toString())){
if(dataInfo.getValue() instanceof Long){
value = ((Long)dataInfo.getValue()).intValue();
}else if(dataInfo.getValue() instanceof String){
value = Integer.parseInt((String)dataInfo.getValue());
}
}else if(field.getType().toString().equals(Float.class.toString())){
if(dataInfo.getValue() instanceof Double){
value = ((Float)dataInfo.getValue()).floatValue();
}else if(dataInfo.getValue() instanceof String){
value = Float.parseFloat((String)dataInfo.getValue());
}
}else if(field.getType().toString().equals(Double.class.toString())){
if(dataInfo.getValue() instanceof Float){
value = ((Double)dataInfo.getValue()).floatValue();
}else if(dataInfo.getValue() instanceof String){
value = Double.parseDouble((String)dataInfo.getValue());
}else if(dataInfo.getValue() instanceof BigDecimal){
value = ((BigDecimal) dataInfo.getValue()).doubleValue();
}
}else if(field.getType().toString().equals(Date.class.toString())){
if(dataInfo.getValue() instanceof Long){
value = ((Long)dataInfo.getValue()).longValue();
}
else if(dataInfo.getValue() instanceof Integer){
value = ((Integer)dataInfo.getValue()).longValue();
}
else if(dataInfo.getValue() instanceof String){
value = NumberUtils.toLong((String)dataInfo.getValue());
}
Date date = new Date();
date.setTime((Long)value);
value = date;
}else if (field.getType().toString().equals(BigDecimal.class.toString())) {
if (dataInfo.getValue() instanceof Integer || dataInfo.getValue() instanceof Float
|| dataInfo.getValue() instanceof Double || dataInfo.getValue() instanceof String) {
value = new BigDecimal(String.valueOf(dataInfo.getValue()));
}
}
try{
Field field1 = clazz.getDeclaredField(dataInfo.getKey());
CompareVal annotation = field1.getAnnotation(CompareVal.class);
if(annotation != null && annotation.doCrypt()){
CryptTypeHanlderHelper cryptTypeHanlderHelper = new CryptTypeHanlderHelper();
value = cryptTypeHanlderHelper.getColumnValue(String.valueOf(value), annotation.cryptEnum());
}
Method declaredMethod = clazz.getDeclaredMethod("set"+dataInfo.getKey().substring(0, 1).toUpperCase(Locale.getDefault())+dataInfo.getKey().substring(1), field.getType());
ReflectionUtils.makeAccessible(declaredMethod);
// declaredMethod.setAccessible(true);
declaredMethod.invoke(obj, value);
}catch(Exception e){
try{
Field field1 = clazz.getSuperclass().getDeclaredField(dataInfo.getKey());
CompareVal annotation = field1.getAnnotation(CompareVal.class);
if(annotation != null && annotation.doCrypt()){
CryptTypeHanlderHelper cryptTypeHanlderHelper = new CryptTypeHanlderHelper();
value = cryptTypeHanlderHelper.getColumnValue(String.valueOf(value), annotation.cryptEnum());
}
Method declaredMethod = clazz.getSuperclass().getDeclaredMethod("set"+dataInfo.getKey().substring(0, 1).toUpperCase(Locale.getDefault())+dataInfo.getKey().substring(1), field.getType());
ReflectionUtils.makeAccessible(declaredMethod);
// declaredMethod.setAccessible(true);
declaredMethod.invoke(obj, value);
}catch(Exception e1){
continue;
}
}
}catch(Exception e){
logger.error("信息变更审核字段设置错误,fieldName={},fieldValue={}",dataInfo.getKey(),dataInfo.getValue(),e);
}
}
return obj;
}
public static Map<String,Object> oldDataToMapByName(String namePrefix,Map<String,Object> oldDataMap,Object obj,Set<String> fieldNames,Class<?> clazz){
for(String fieldName:fieldNames){
oldDataToMapFieldByName(namePrefix, oldDataMap, obj, fieldName, clazz);
}
return oldDataMap;
}
public static void oldDataToMapFieldByName(String namePrefix,Map<String,Object> oldDataMap,Object obj,String fieldName,Class<?> clazz){
Field field = getField(fieldName, clazz);
if(field == null){
field = getParentField(fieldName, clazz);
}
if(field == null){
return;
}
Object value = reSetValue(field, obj);
oldDataMap.put(namePrefix + fieldName, value);
}
public static Field getField(String fieldName,Class<?> clazz){
try {
Field field = clazz.getDeclaredField(fieldName);
return field;
}catch(Exception e){
return null;
}
}
public static Field getParentField(String fieldName,Class<?> clazz){
try {
Field field = clazz.getSuperclass().getDeclaredField(fieldName);
return field;
}catch(Exception e){
return null;
}
}
public static Object reSetValue (Field field ,Object object){
Object value = null;
try {
ReflectionUtils.makeAccessible(field);
value = field.get(object);
} catch (IllegalAccessException e) {
logger.warn("信息变更审核字段设置错误,fieldName={}",field.getName(),e);
return value;
}
if(field.isAnnotationPresent(CompareVal.class)){
CompareVal annotation = field.getAnnotation(CompareVal.class);
if(annotation.zeroEqNull() && value == null){
value = 0;
}
}
return value;
}
public static Map<String,Object> oldDataToMap(Map<String,Object> oldDataMap,Object obj,Set<String> fieldNames,Class<?> clazz){
return oldDataToMapByName("", oldDataMap, obj, fieldNames, clazz);
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Inherited
public @interface CompareVal {
/**
* 是否比较
* @return
*/
boolean value() default true;
/**
* 所设值0与null意义相等
* @return
*/
boolean zeroEqNull() default false;
/**
* 是否加密敏感信息
* @return
*/
boolean doCrypt() default false;
/**
* 存储敏感信息加解密密钥的指定枚举类
* @return
*/
CryptEnum cryptEnum() default CryptEnum.ID_CARD;
}
日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com