详细分析Java中的脱敏注解(附Demo)
脱敏注解用于标记数据在显示或输出时需要进行的特定脱敏处理,如用星号(*)替换字符串中部分字符、用特定格式替换日期等。
以下是一个简单的脱敏注解的示例:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Desensitize {
DesensitizeType type();
int length() default -1;
}
public enum DesensitizeType {
CHINESE_NAME, // 中文名
PHONE, // 手机号
ID_CARD, // 身份证号
BANK_CARD, // 银行卡号
EMAIL, // 邮箱
USERNAME, // 用户名
PASSWORD, // 密码
DATE, // 日期
CUSTOM // 自定义
}
使用脱敏注解的示例:
public class User {
@Desensitize(type = DesensitizeType.CHINESE_NAME, length = 3)
private String name;
@Desensitize(type = DesensitizeType.BANK_CARD)
private String bankCard;
// getters and setters
}
在实际使用时,你可能需要编写一个处理脱敏注解的工具类来读取注解并进行数据脱敏。以下是一个简单的脱敏工具类的示例:
public class DesensitizationHelper {
public static String desensitize(Object object) {
if (object == null) {
return null;
}
// 获取对象的类
Class<?> clazz = object.getClass();
// 获取所有方法
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
// 检查方法是否有脱敏注解
if (method.isAnnotationPresent(Desensitize.class)) {
Desensitize desensitize = method.getAnnotation(Desensitize.class);
try {
// 调用方法获取返回值
Object returnValue = method.invoke(object);
if (returnValue != null) {
String desensitizedValue = desensitizeValue(returnValue.toString(), desensitize.type(), desensitize.length());
method.invoke(object, desensitizedValue);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return object.toString();
}
private static String desensitizeValue(String value, DesensitizeType type, int length) {
switch (type) {
case CHINESE_NAME:
return DesensitizationUtil.desensitizeChineseName(value, length);
case PHONE:
return DesensitizationUtil.desensitizePhone(value);
case ID_CARD:
return DesensitizationUtil.desensitizeIdCard(value);
case BANK_CARD:
return DesensitizationUtil.desensitizeBankCard(val
评论已关闭