电话号码或者姓名的隐藏小工具

使用的是hutool的工具类

 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency>

1.自定义加密注解

/*** @description  虚拟手机号注解<br>*   在实体中需要被加密的字段上使用该注解(目前仅用于加密手机号码中间4位)<br>*   conditionField参数可以为空,为空时,强制解密注解字段<br>*   conditionField参数会告知程序,依据这个字段的数值,来决定是否加密注解字段**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface VirtualMobile {/*** 加密条件字段<br>* 这个参数所指向的字段需要是integer类型<br>* 条件字段为1执行加密,为0不执行加密(如果这个字段是别的整数数值,强制加密;如果是别的类型的值,打印异常信息,并返回原值)<br>* 若该参数是一个不存在的字段,则强制加密** @return String*/String conditionField() default "";}

2.注解处理器(这里写了静态方法,调用方法时执行加密操作)


public class VirtualMobileProcessor {/*** 加密Bean对象中的指定字段<br>* 用于加密实体对象中的手机号码字段** @param object Bean对象* @param clazz  对象类型* @return 加密之后的JavaBean*/public static <T> T cryptoMobile(T object, Class<T> clazz) {String cryptoField;String conditionField;//判断是否有打了注解的字段for (Field declaredField : clazz.getDeclaredFields()) {VirtualMobile annotation = declaredField.getAnnotation(VirtualMobile.class);//找到注解字段,则执行字段加密if (Validator.isNotNull(annotation)) {cryptoField = declaredField.getName();conditionField = annotation.conditionField();return copyBean(cryptoField, conditionField, object, clazz);}}//没有找到注解字段,直接返回传入的对象return Convert.convert(clazz, object);}/*** 加密集合中每个对象的指定字段<br>* 用于加密实体对象中的手机号码字段** @param collection Bean对象集合* @param clazz      集合中的对象类型* @return 加密之后的JavaBean集合*/public static <T> Collection<T> cryptoMobileForList(Collection<T> collection, Class<T> clazz) {return collection.stream().map(t -> cryptoMobile(t, clazz)).collect(Collectors.toList());}/*** 加密Bean对象<br>* 传入需要被加密的Bean,返回加密之后的Bean** @param cryptoField    需要被加密的字段* @param conditionField 参考是否加密的条件字段* @param object         Bean对象* @param clazz          对象类型* @return 加密之后的JavaBean*/private static <T> T copyBean(String cryptoField, String conditionField, T object, Class<T> clazz) {try {//cryptoField参数为空,直接返回原对象if (Validator.isEmpty(cryptoField)) {return Convert.convert(clazz, object);}//判断条件字段if (Validator.isNotEmpty(conditionField)) {for (Field declaredField : clazz.getDeclaredFields()) {declaredField.setAccessible(true);//不加密if (declaredField.getName().equals(conditionField) && Integer.valueOf(String.valueOf(declaredField.get(object))) == 0) {return Convert.convert(clazz, object);}//加密if (declaredField.getName().equals(conditionField) && Integer.valueOf(String.valueOf(declaredField.get(object))) == 1) {return cryptoBean(cryptoField, object, clazz);}}}//条件字段为空,强制加密return cryptoBean(cryptoField, object, clazz);} catch (Exception e) {e.printStackTrace();//发生异常,返回原对象return Convert.convert(clazz, object);}}/*** 加密Bean中的指定字段** @param cryptoField 需要被加密的字段* @param object      Bean对象* @param clazz       对象类型* @return 加密之后的JavaBean*/private static <T> T cryptoBean(String cryptoField, T object, Class<T> clazz) {try {for (Field declaredField : clazz.getDeclaredFields()) {declaredField.setAccessible(true);if (declaredField.getName().equals(cryptoField)) {BeanUtil.setFieldValue(object, cryptoField, createVirtualMobile(String.valueOf(declaredField.get(object))));}}return Convert.convert(clazz, object);} catch (Exception e) {e.printStackTrace();return Convert.convert(clazz, object);}}/*** 加密手机号码中间4位<br>* 如果不是11位手机号码,直接返回原值** @param mobile 加密前的手机号码* @return 加密后的手机号码*/private static String createVirtualMobile(String mobile) {try {//转换成Long如果异常或者不是11位,就说明不是手机号码,直接返回传入的对象Long.valueOf(mobile);if (mobile.length() != 11) {return mobile;}return StrUtil.hide(mobile, 3, 7);} catch (Exception e) {return mobile;}}public static void main(String[] args) {Student  student=cryptoMobile(new Student(randomLong(11111111L, 99999999L),"张三",String.valueOf(randomLong(13011111111L, 13099999999L)),1, LocalDateTime.now()), Student.class);//单对象测试System.out.println(student);student.setName(StrUtil.hide(student.getName(),1,student.getName().length()));System.out.println(student);}}

实体

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {private Long id;private String name;@VirtualMobile(conditionField = "cryptoStatus")private String mobile;private Integer cryptoStatus;private LocalDateTime createTime;}

电话号码或者姓名的隐藏小工具相关推荐

  1. hidden for mac(桌面文件隐藏小工具)

    想要快速隐藏mac电脑上的桌面图标吗?赶紧下载免费版的hidden for mac,只需点击一下,选择隐藏即可快速隐藏桌面上的所有图标,非常方便!本站现在提供hidden mac版下载,附使用教程,请 ...

  2. python编写姓名年龄_python小工具 - alert弹框输出姓名年龄、求和

    # 导入tkinter的所有的包里面所有的内容from tkinter import *import tkinter.messageboxasmessagebox # 从Frame派生一个Applic ...

  3. 用这个小工具轻松 get Mac 隐藏功能

    在 macOS 系统中,有一些隐藏功能,这些功能默认未被开启.这是一些属于"没有也能用,有了更好用"的功能,通过有选择性地开启某些隐藏功能,可以更加方便我们的对 Mac 的使用.不 ...

  4. 《神奇:长达30分钟的3D视频,只需200多K》中隐藏程序到Jpg图片中的小工具

    今天同事发了一个好玩的东西, 共享 给大家: 神奇:长达30分钟的3D视频,只需200多K 表面看起来这是一只小鸭的图片,然而把文件后缀名改成RAR,然后解压缩,很神奇的事情就发生了!  推荐配置:2 ...

  5. 【小工具】一键隐藏/显示MacOS的应用图标

    不知诸位有没有这样一个需求,当MacOS打开应用多的时候,Dock栏可能会很拥挤: 那么需求就产生了,能不能将某些软件的图标在Dock隐藏掉,同时也不影响日常使用呢?有的,接下来即将给出成熟的解决方案 ...

  6. 如何开启win10高性能模式,触发win10隐藏电源管理模式,自制开启win10高性能模式的桌面小工具。

    高性能模式是Windows提供的一种电源管理模式,该模式下可以最大限度的发挥出电脑硬件的性能,尤其是CPU和显卡. 很多小伙伴打开电源设置却找不到高性能这一选项,只有平衡模式,这是因为被Windows ...

  7. 手机息屏后停止_手机息屏还能这样玩?华为这几个隐藏小功能快学起来

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 注:本文转载自网络,如有侵 ...

  8. python课程小作业之桌面小工具系统

    from tkinter import *#图形界面包 from tkinter import messagebox import os.path import os import math impo ...

  9. 锁屏界面提示某些设置已隐藏_息屏还有这些“骚操作”,华为这几个隐藏小功能快用起来...

    现在手机系统更新太快了,有时候根本不知道新手机到底有什么便捷功能! 确实,很多小伙伴换了新手机后,都没怎么对系统深入研究,每当得知的时候就一脸"相见恨晚". 对于经常搞机.喜欢发掘 ...

最新文章

  1. 逃出你的肖申克(三):遇见20万年前的自己
  2. 深入理解C++内存管理
  3. Linux 零拷贝 sendfile函数中文说明及实际操作
  4. java中的多线程的示例
  5. java 过滤列表_Java 8 Stream过滤列表中列表的值
  6. realme Q5 Pro Vans联名版曝光:经典棋盘格图案设计 辨识度拉满
  7. 如何从Web浏览器远程监视Linux服务器和桌面
  8. 廖雪峰全套Java教程下载(稀有资源)
  9. Java毕设项目银行贷款管理系统计算机(附源码+系统+数据库+LW)
  10. RHCSA-Day1 --- Linux介绍及环境搭建
  11. nextjs中阿里icon库的引入使用
  12. 第6节 Tableau 直方图 | 评分直方图
  13. 电容去耦原理笔记(彻底理解并伴有公式计算)
  14. element 问号提示_点击HTML页面问号出现提示框(附源码)
  15. mysql存储过程 根据查询的结果集向表中插入数据
  16. 大创项目(记录自己的教训)
  17. iOS 左上角的返回按钮的几种设置
  18. 自动驾驶小实验之Turtlebot3_Autopilot(Tensorflow, OpenCV, ROS, PID)
  19. 图片名称重命名错误了怎么恢复
  20. mysql查询表中价格区间_MySQL统计价格区间内的商品数量sql语句

热门文章

  1. FFmpeg —— Linux下进行编译配置(硬件加速编解码)
  2. Android集成阿里消息推送
  3. 2020年09月-电子学会青少年等级考试C语言(二级)真题与解析
  4. 游戏人物第三人称操控及视角转变
  5. 根据列名提取指定列 shell awk
  6. SPI flash烧录器EZP2019试用记录
  7. 001计算机网络基础习题+答案+解析
  8. 十大排序算法(C语言代码)
  9. MATLAB:线条属性
  10. 现代景观的语言学艺术探析(《规划师》)