Java注解对象数据脱敏实现

真是闲的蛋疼,不想一个一个get、set去脱敏,非要花几倍的时间写个注解去脱敏,这不是沙雕是什么啊。。。

1.公共接口

主要是方便拓展吧,总不能手机脱敏后再来个身份证脱敏还要修改里面的方法。。。

public interface Desensitization {
    /**
     * 获取脱敏数据
     *
     * @param originData 原始数据
     * @return 脱敏后数据
     */
    String getDesensitizationData(String originData);
}

2.其中的一个实现类

public class PhoneDesensitization implements Desensitization {
    /**
     * 获取脱敏数据
     *
     * @param originData 原始数据
     * @return 脱敏数据
     */
    @Override
    public String getDesensitizationData(String originData) {
    	// 不想自己写了这里用的hutool的工具类
        return DesensitizedUtil.mobilePhone(originData);
    }
}

3.注解

@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Desensitization {
	 // class需是接口的子类
     Class<? extends com.yang.iface.desensitization.Desensitization> value();
}

4.工具类

public class DesensitizationUtils {

    /**
     * 脱敏对象
     * 可以不用泛型,直接Object即可
     *
     * @param domain 对象
     * @param  对象
     */
    public static <T> void dePojo(T domain) {
        try {
            Class<?> clazz = domain.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                Desensitization annotation = field.getAnnotation(Desensitization.class);
                if (annotation != null) {
                    Class<?> aClass = annotation.value();
                    // if判断可不加,因为aClass必定是接口的子类
                    if (com.yang.iface.desensitization.Desensitization.class.isAssignableFrom(aClass)) {
                        com.yang.iface.desensitization.Desensitization desensitizationChild = (com.yang.iface.desensitization.Desensitization) aClass.newInstance();
                        // getFieldValue、setFieldValue 用的本身就是Field的set()和get()方法
                        String data = ObjectUtils.getFieldValue(field, domain);
                        String desensitizationData = desensitizationChild.getDesensitizationData(data);
                        ObjectUtils.setFieldValue(field, desensitizationData, domain);
                    }
                }
            }
        } catch (Exception ignore) {
        }
    }
}

5.结束

DesensitizationUtils.dePojo(obj);

你可能感兴趣的:(Java,java,反射)