电话号码或者姓名的隐藏小工具
电话号码或者姓名的隐藏小工具
使用的是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;}
电话号码或者姓名的隐藏小工具相关推荐
- hidden for mac(桌面文件隐藏小工具)
想要快速隐藏mac电脑上的桌面图标吗?赶紧下载免费版的hidden for mac,只需点击一下,选择隐藏即可快速隐藏桌面上的所有图标,非常方便!本站现在提供hidden mac版下载,附使用教程,请 ...
- python编写姓名年龄_python小工具 - alert弹框输出姓名年龄、求和
# 导入tkinter的所有的包里面所有的内容from tkinter import *import tkinter.messageboxasmessagebox # 从Frame派生一个Applic ...
- 用这个小工具轻松 get Mac 隐藏功能
在 macOS 系统中,有一些隐藏功能,这些功能默认未被开启.这是一些属于"没有也能用,有了更好用"的功能,通过有选择性地开启某些隐藏功能,可以更加方便我们的对 Mac 的使用.不 ...
- 《神奇:长达30分钟的3D视频,只需200多K》中隐藏程序到Jpg图片中的小工具
今天同事发了一个好玩的东西, 共享 给大家: 神奇:长达30分钟的3D视频,只需200多K 表面看起来这是一只小鸭的图片,然而把文件后缀名改成RAR,然后解压缩,很神奇的事情就发生了! 推荐配置:2 ...
- 【小工具】一键隐藏/显示MacOS的应用图标
不知诸位有没有这样一个需求,当MacOS打开应用多的时候,Dock栏可能会很拥挤: 那么需求就产生了,能不能将某些软件的图标在Dock隐藏掉,同时也不影响日常使用呢?有的,接下来即将给出成熟的解决方案 ...
- 如何开启win10高性能模式,触发win10隐藏电源管理模式,自制开启win10高性能模式的桌面小工具。
高性能模式是Windows提供的一种电源管理模式,该模式下可以最大限度的发挥出电脑硬件的性能,尤其是CPU和显卡. 很多小伙伴打开电源设置却找不到高性能这一选项,只有平衡模式,这是因为被Windows ...
- 手机息屏后停止_手机息屏还能这样玩?华为这几个隐藏小功能快学起来
阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 注:本文转载自网络,如有侵 ...
- python课程小作业之桌面小工具系统
from tkinter import *#图形界面包 from tkinter import messagebox import os.path import os import math impo ...
- 锁屏界面提示某些设置已隐藏_息屏还有这些“骚操作”,华为这几个隐藏小功能快用起来...
现在手机系统更新太快了,有时候根本不知道新手机到底有什么便捷功能! 确实,很多小伙伴换了新手机后,都没怎么对系统深入研究,每当得知的时候就一脸"相见恨晚". 对于经常搞机.喜欢发掘 ...
最新文章
- 逃出你的肖申克(三):遇见20万年前的自己
- 深入理解C++内存管理
- Linux 零拷贝 sendfile函数中文说明及实际操作
- java中的多线程的示例
- java 过滤列表_Java 8 Stream过滤列表中列表的值
- realme Q5 Pro Vans联名版曝光:经典棋盘格图案设计 辨识度拉满
- 如何从Web浏览器远程监视Linux服务器和桌面
- 廖雪峰全套Java教程下载(稀有资源)
- Java毕设项目银行贷款管理系统计算机(附源码+系统+数据库+LW)
- RHCSA-Day1 --- Linux介绍及环境搭建
- nextjs中阿里icon库的引入使用
- 第6节 Tableau 直方图 | 评分直方图
- 电容去耦原理笔记(彻底理解并伴有公式计算)
- element 问号提示_点击HTML页面问号出现提示框(附源码)
- mysql存储过程 根据查询的结果集向表中插入数据
- 大创项目(记录自己的教训)
- iOS 左上角的返回按钮的几种设置
- 自动驾驶小实验之Turtlebot3_Autopilot(Tensorflow, OpenCV, ROS, PID)
- 图片名称重命名错误了怎么恢复
- mysql查询表中价格区间_MySQL统计价格区间内的商品数量sql语句