1. mobilenumber = mobilenumber.substring(0, 3) + "***"
    mobilenumber.substring(length - 4, length);
  2. @Desensitization(desensitization=DesensitizationEnum.MOBILE_PHONE)
    private
  3. ResponseVO<List<CustInfos>> responseVO = custInfoService.selectCustInfoList(formMap);
    LOGGER.info("条件查询客户列表查询结果:" + responseVO.getResult());
    custInfolist = responseVO.getData();
    custInfolist = DesensitizationUtils.desensitizationList(custInfolist);

 

/**
 * 脱敏工具
 */
public class
private static final Logger LOGGER = LoggerFactory.getLogger(DesensitizationUtils.class);
/**
     * 脱敏
     * @param objList
     * @return
     */
public static <T> List<T> desensitizationList(List<T> objList) {
dobjList = new
for (T obj : objList) {
dobjList.add(desensitization(obj));
        }
return dobjList;
    }
/**
     * 脱敏
     * @param obj
     * @return
     */
public static <T> T desensitization(T obj) {
try
extends Object> clazz = obj.getClass();
//获取所有自己声明的属性 
fields = clazz.getDeclaredFields();
//遍历属性 
for (Field field : fields) {
//通过注解中的值来获取属性名(注解中的值应该与属性名相等) 
Desensitization columnField = field.getAnnotation(Desensitization.class);
//如果是没有注解的属性忽略掉
if (null == columnField) {
continue;
                }
type = field.getGenericType().toString(); //获取属性的类型 
pd = new PropertyDescriptor(field.getName(), clazz);
rM = pd.getReadMethod();//获得读方法   
oldValue = (Object) rM.invoke(obj);
newValue = oldValue;
if (null != oldValue) {
wM = pd.getWriteMethod();//获得写方法   
desensitizationValue = columnField.desensitization();
doMethodName = "do"
desensitizationValue.toString().replace("_", "")
                                              .substring(0, 1).toUpperCase()
desensitizationValue.toString().replace("_", "")
                                              .toLowerCase().substring(1);
getMethod = DesensitizationUtils.class.getDeclaredMethod(doMethodName,
class, Object.class);
newValue = getMethod.invoke(DesensitizationUtils.class, type, oldValue);
wM.invoke(obj, newValue);
                }
            }
catch (Exception e) {
LOGGER.error("脱敏处理失败{}", e);
        }
return obj;
    }
/**
     * [中文姓名] 只显示第一个汉字,其他隐藏为星号<例子:李**>
     */
public static Object doChinesename(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用'' 
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
        }
//字符串表示法 
fullName = oldValue.toString();
name = StringUtils.left(fullName, 1);
return StringUtils.rightPad(name, fullName.length(), "*");
    }
/**
     * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
     * @return
     */
public static Object doIdcard(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用'' 
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
        }
//字符串表示法 
id = oldValue.toString();
int length = id.length();
if (length
return id;
        }
num = StringUtils.right(id, 4);
return StringUtils.leftPad(num, id.length(), "*");
    }
/**
     * [固定电话] 后四位,其他隐藏<例子:****1234>
     */
public static Object doFixedphone(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用'' 
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
        }
//字符串表示法 
num = oldValue.toString();
int length = num.length();
if (length
return num;
        }
return StringUtils.leftPad(StringUtils.right(num, 4), num.length(), "*");
    }
/**
     * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
     * 
     * @return
     */
public static Object doMobilephone(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用'' 
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
        }
//字符串表示法 
mobilnumber = oldValue.toString();
int length = mobilnumber.length();
if (length
return mobilnumber;
        }
return StringUtils.left(mobilnumber, 3).concat(
            StringUtils.removeStart(
                StringUtils.leftPad(StringUtils.right(mobilnumber, 4), mobilnumber.length(), "*"),
"***"));
    }
/**
     * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>
     */
public static Object doAddress(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用'' 
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
        }
//字符串表示法 
address = oldValue.toString();
int length = address.length();
if (length
return address;
        }
return StringUtils.rightPad(StringUtils.left(address, length / 2), length, "*");
    }
/**
     * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com> 
     */
public static Object doEmail(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用'' 
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
        }
//字符串表示法 
email = oldValue.toString();
int index = StringUtils.indexOf(email, "@");
if (index
return email;
        }
return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(
            StringUtils.mid(email, index, email.length()));
    }
/**
     * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
     */
public static Object doBankcard(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用'' 
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
        }
//字符串表示法 
cardNum = oldValue.toString();
int length = cardNum.length();
if (length
return cardNum;
        }
return StringUtils.left(cardNum, 6).concat(
            StringUtils.removeStart(
                StringUtils.leftPad(StringUtils.right(cardNum, 4), length, "*"), "******"));
    }
}