使用注解对手机号及卡号加验工具类

一、定义加验地注解类

/**
 * @Description:加掩码注解
 * @Author: yunpeng.zhao
 * @date 2017-08-19 18:51
 */
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
public @interface Cover {

    /***
     * 替换字符串
     * @return
     */
    String replace()
        default "****";
}

二、加验工具类

/***
 * @Descriptoin:常用工具类
 * @Author: yunpeng.zhao
 * @Date: 2017/3/15
 */
public class CoverUtils {

    private final static Logger logger = LoggerFactory.getLogger(CoverUtils.class);

    /**
     *
     * <p>反序列化</p>
     * @Title deserializeObject
     * @param buf
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     * @return Object
     * @author shihj
     * @Create 2014年1月19日
     */
    public static  Object deserializeObject(byte[] buf) throws IOException, ClassNotFoundException {
        Object object = null;
        ByteArrayInputStream sais = new ByteArrayInputStream(buf);
        ObjectInputStream ois = new ObjectInputStream(sais);
        object =  ois.readObject();
        return object;
    }

    /**
     *  取卡号后四位
     * @param cardNo
     * @return
     */
    public static String getLast4CardNo(String cardNo){
        try {
            if(cardNo!=null && cardNo.trim().length()>4){
                String temp = cardNo.trim();
                return temp.substring(cardNo.length()-4);
            }
        } catch (Exception e) {
            logger.error("取卡号后四位发生异常", e);
        }
        return cardNo;
    }

    /**
     * 对卡号进行遮盖,只显示前6后4
     * @param cardNo
     * @return
     */
    public static String coverCardNo(String cardNo){
        try {
            if(cardNo!=null && cardNo.trim().length()>10){
                String temp = cardNo.trim();
                return temp.substring(0, 6)+"******"+temp.substring(cardNo.length()-4);
            }
        } catch (Exception e) {
            logger.error("对卡号进行遮盖发生异常", e);
        }
        return cardNo;
    }

    /***
     * 对敏感信息进行遮掩
     * @param coverStr
     * @return
     */
    public static String cover(String coverStr){
        try {
            if(StringUtils.isNotBlank(coverStr)){
                String temp = coverStr.trim();
                if(coverStr.length() > 11){
                    return temp.substring(0, 6)+"*****"+temp.substring(coverStr.length()-4);
                }else if(coverStr.length() > 4){
                    return temp.substring(0, 3)+"****"+temp.substring(coverStr.length()-4);
                }else if(coverStr.length() > 0){
                    return "***";
                }
            }
        } catch (Exception e) {
            logger.error("对敏感信息进行遮盖发生异常", e);
        }
        return coverStr;
    }

    /***
     * 通过注解toString方法
     * @param object
     * @return
     */
    public static String toString(Object object){
        return toString(object, true);
    }


    /***
     * 通过注解toString方法
     * @param object
     * @param isFormatBigDecimal
     * @return
     */
    public static String toString(Object object, boolean isFormatBigDecimal){
        if(object == null){
            return "null";
        }
        Class<?> clazz = object.getClass();
        Map<String, Object> paramMap = new HashMap<String, Object>(16);
        List<Object> objects =  new ArrayList<Object>();
        List<Field> fieldList = getObjectFields(object);
        for(Field field : fieldList){
            field.setAccessible(true);
            Object o = null;
            try {
                o = field.get(object);
                boolean fieldAnnotationPresent = field.isAnnotationPresent(Cover.class);
                //对字符串且添加注解的值进行掩码
                if(o instanceof String && fieldAnnotationPresent){
                    String value = (String) o;
                    value = cover(value);
                    paramMap.put(field.getName(), value);
                }else {
                    if(o == null){
                        continue;
                    }
                    if(o instanceof Enum){
                        paramMap.put(field.getName(), o);
                    }else if(o instanceof Double){
                        Double d = (Double) o;
                        NumberFormat nf = NumberFormat.getNumberInstance();
                        // 保留3位小数
                        nf.setMaximumFractionDigits(2);
                        // 如果不需要四舍五入,可以使用RoundingMode.DOWN
                        nf.setRoundingMode(RoundingMode.UP);
                        paramMap.put(field.getName(), nf.format(d));
                    }else if(o instanceof BigDecimal && isFormatBigDecimal){
                        BigDecimal decimal = (BigDecimal) o;
                        NumberFormat nf = NumberFormat.getNumberInstance();
                        // 保留3位小数
                        nf.setMaximumFractionDigits(2);
                        // 如果不需要四舍五入,可以使用RoundingMode.DOWN
                        nf.setRoundingMode(RoundingMode.UP);
                        paramMap.put(field.getName(), nf.format(decimal));
                    }else if(o.getClass().toString().contains("com.yeepay.g3") && fieldAnnotationPresent){
                        paramMap.put(field.getName(), toString(o));
                    }else if("extendMap".equals(field.getName())){
                        continue;
                    }else{
                        paramMap.put(field.getName(), o);
                    }
                }
            } catch (IllegalAccessException e) {
                logger.error("获取变量值出现IllegalAccessException异常", e);
            }
        }

        return JSONUtils.toJsonString(paramMap);
    }

    /***
     * 通过参数名重新toString方法
     * @param object
     * @param coverParams
     * @return
     */
    public static String toString(Object object, String[] coverParams){
        String str = JSONObject.toJSONString(object);
        Map<String, String> map = JSONUtils.jsonToMap(str, String.class, String.class);
        if(map !=null && map.size() > 0){
            for(Map.Entry<String, String> entry : map.entrySet()){
                String key = entry.getKey();
                for(String coverParam : coverParams){
                    if(coverParam.equals(key)){
                        map.put(key, cover(entry.getValue()));
                    }
                }
            }
            return JSONObject.toJSONString(map);
        }
        return str;
    }

    /***
     * 通过参数名设置对象成员对应值
     * @param object
     * @param fieldName
     * @param value
     */
    public static void setFieldValue(Object object, String fieldName, Object value){

        if(object == null && StringUtils.isBlank(fieldName)){
            logger.info("通过参数名设置对象成员对应值失败,object或fieldName为空");
            return;
        }
        try {
            Class<?> clazz = object.getClass();
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(object, value);
        } catch (Exception e) {
            logger.error("通过参数名设置对象成员对应值出现异常", e);
        }
    }



    /***
     * 获取对象成员信息
     * @param object
     * @return
     */
    public static  List<Field> getObjectFields(Object object){

        List<Field> fieldList = new ArrayList<Field>();
        if(object == null){
            return fieldList;
        }
        Class<?> clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        Field[] superFields = clazz.getSuperclass().getDeclaredFields();
        Map<String, Object> paramMap = new HashMap<String, Object>();
        for(Field field :superFields){
            fieldList.add(field);
        }
        for(Field field :fields){
            fieldList.add(field);
        }
        //多重继承需要
        if (clazz.getSuperclass().getSuperclass() != null){
            Field[] super2Fields = clazz.getSuperclass().getSuperclass().getDeclaredFields();
            for(Field field :super2Fields){
                fieldList.add(field);
            }
        }
        return fieldList;
    }

    /**
     * yop请求验证appKey和商户商编 是否 不匹配
     * @param appKey
     * @param customerNo
     * @return
     */
    public static boolean validateCustomer (String appKey , String customerNo){
        if(!getStringArray(appKey,"_").equals(customerNo)){
            return true;
        }
        return false;
    }

    /**
     * 将字符串用regex切割返回数组最后一个值
     * @param str
     * @param regex
     * @return
     */
    public static String getStringArray(String str , String regex){
        if(StringUtils.isNotBlank(str) && StringUtils.isNotBlank(regex)){
            String[] stringArray = str.split(regex);
            return stringArray[stringArray.length - 1];
        }
        return "";
    }
}

三、如何使用:对需要加验地类重写toString()方法即可。

LOGGER.info("{}请求参数:{}",name, CoverUtils.toString(args[0]));

四、该注解需要spring扫描管理后,才能使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的注解是一种元数据,用于为程序的元素(如类、方法、字段等)提供额外的信息。注解可以通过反射机制在运行时获取并处理。如果你想在注解使用正则表达式验证手机号码,可以按照以下步骤进行操作: 首先,创建一个注解类型,用于标记需要验证手机号码的元素。可以使用`@Target`注解指定该注解可以应用于哪些元素(例如类、方法等),并使用`@Retention`注解指定该注解在什么时候可见(例如源代码、编译时和运行时)。 ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface PhoneNumber { String value() default ""; } ``` 然后,在需要验证手机号码的地方,使用注解并指定正则表达式作为注解参数。 ```java public class User { @PhoneNumber("^1[3-9]\\d{9}$") private String phoneNumber; // 其他代码... } ``` 最后,在相应的地方使用反射机制获取该注解,并根据注解中指定的正则表达式进行手机号码的验证。 ```java import java.lang.reflect.Field; import java.util.regex.Pattern; public class Main { public static void main(String[] args) throws IllegalAccessException { User user = new User(); user.phoneNumber = "13812345678"; Field field = user.getClass().getDeclaredField("phoneNumber"); PhoneNumber phoneNumberAnnotation = field.getAnnotation(PhoneNumber.class); if (phoneNumberAnnotation != null) { String regex = phoneNumberAnnotation.value(); String phoneNumber = (String) field.get(user); if (!Pattern.matches(regex, phoneNumber)) { System.out.println("手机号码验证失败!"); } } } } ``` 以上代码演示了如何使用注解和正则表达式来验证手机号码。你可以根据实际需求进行进一步调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值