首页 > 编程语言 >【Java注解】自定义注解的简单demo

【Java注解】自定义注解的简单demo

时间:2024-04-24 14:23:13浏览次数:31  
标签:lang java String 自定义 demo field import 注解 annotation

需求场景

对于特定字段进行脱敏

实现步骤

首先创建注解@interface

 1 import java.lang.annotation.ElementType;
 2 import java.lang.annotation.Retention;
 3 import java.lang.annotation.RetentionPolicy;
 4 import java.lang.annotation.Target;
 5 
 6 @Retention(RetentionPolicy.RUNTIME)
 7 @Target(ElementType.FIELD)
 8 public @interface DesenStr {
 9 
10 }

其次创建注解操作的类

import java.lang.reflect.Field;

public class AnnotationClass {

    public Object parse(Object o) {
        Class<?> mClass = null;
        Object o1 = o;
        try {
            mClass = o.getClass();
            Field[] fields = mClass.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(DesenStr.class)) {
                    field.setAccessible(true);

                    String s = String.valueOf(field.get(o1));
                    String replace = StringUtil.desen(s.trim());// 脱敏
                    field.set(o1, replace);
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();// 此处可自定义打印日志
        }
        return o1;
    }
}

有的小伙伴需要明确替换的char,可以用

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 DesenStr {

    String source() default "";

    String target() default "";
}
import com.dxinfor.mini.ebill.utils.StringUtil;

import java.lang.reflect.Field;

public class AnnotationClass {

    public Object parse(Object o) {
        Class<?> mClass = null;
        Object o1 = o;
        try {
            mClass = o.getClass();
            Field[] fields = mClass.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(DesenStr.class)) {
                    field.setAccessible(true);
                    DesenStr annotation = field.getAnnotation(DesenStr.class);
                    String source = annotation.source();// 待匹配
                    String target = annotation.target();// 替换为

                    String s = String.valueOf(field.get(o1));
                    String replace = s.replace(source,target);
                    field.set(o1, replace);
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return o1;
    }
}

随后在需要替换的成员变量上加上注解  @DesenStr 

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo{
    @DesenStr
    private String userId;
    private String userName;
}

再在使用的地方调用parse方法进行脱敏(此处可以写成AOP)

为了方便就暂时用@Test演示

@Test
void parse(){
    UserInfo userInfo= new UserInfo ("1328223342","张三");
    System.out.println(userInfo);// 1328223342 张三
    Object parseObject = new AnnotationClass().parse(userInfo);
    if(parseObject instanceof UserInfo){
        UserInfo newUserInfo = (UserInfo) parseObject;
        System.out.println(newUserInfo);// 132****342 张三
    }
}

 

标签:lang,java,String,自定义,demo,field,import,注解,annotation
From: https://www.cnblogs.com/onejay/p/18155177

相关文章

  • Django 自定义创建密码重置确认页面
    要实现上述功能,你需要修改模板文件以添加“忘记密码”链接,并创建新的视图函数来处理密码丢失修改页面、验证和密码修改。下面是你可以进行的步骤:1.修改模板文件在登录页面的表单下方添加一个“忘记密码”链接:<divclass="form-grouptext-center"><buttontype="submit"......
  • 自定义Mini-Tomcat之动态资源返回实现
    在自定义Mini-Tomcat之基本架构V3需求中实现了访问动态资源,该实现案例中的动态资源通过两个配置文件获取:server.xml:web.xml:下面是对这俩配置文件的解析保存数据:......
  • 详细分析Java中的@JsonFormat注解和@DateTimeFormat注解
    @DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")privateDatecreated_on;在前后端数据交互的过程中,Data类型的数据经常会出现类型映射转换的错误,为了达到业务的目标时间格式,通常会使用@JsonFormat和@DateTi......
  • 24-自定义持久层框架
    1.JDBC的使用问题代码示例:publicclassJDBCTest{publicstaticvoidmain(String[]args){Connectionconnection=null;PreparedStatementpreparedStatement=null;ResultSetresultSet=null;try{//加载数......
  • 自定义Mini-Tomcat(一)
    在Spring+ / SpringMVC中使用到了Tomcat。那么Tomcat提供什么功能呢?访问使用HTTP协议,所以它首先是一个HTTP服务器(关于HTTP协议资料较多自行查找);其次MVC提供servlet部署在tomcat中进行实际的业务操作,所以它还是一个Servlet容器。下面定义一个Mini-Tomcat提供以上两个......
  • HIVE使用java生成自定义(UDF)函数,并在hive命令中使用
      创建一个maven项目(不要用springboot)  引入依赖<!--添加hive依赖--><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.1</versio......
  • maixcam部署自定义模型
    maixcam部署yolov5s自定义模型本博客将向你展示零基础一步步的部署好自己的yolov5s模型(博主展示的是安全帽模型),训练就引用我自己之前写过的,已经训练好的可以跳过该部分,其中有部分不一样。获得自定义训练得到的yolov5sonnx模型准备自定义数据集(博主用的是VOC数据集)数据集......
  • HarmonyOS NEXT应用开发案例—自定义日历选择器
    介绍本示例介绍通过CustomDialogController类显示自定义日历选择器。效果图预览使用说明加载完成后显示主界面,点当前日期后会弹出日历选择器,选择日期后会关闭弹窗,主页面日期会变成选定的日期。实现思路获取当前月和下个月的日期信息。源码参考GetDate.ets。constSATU......
  • vis.js外部自定义折线图
    代码案例<!doctypehtml><html><head><title>Timeline</title><scripttype="text/javascript"src="https://unpkg.com/vis-timeline@latest/standalone/umd/vis-timeline-graph2d.min.js"></script>......
  • jeect 自定义包路径问题
    问题描述Annotation-specifiedbeanname'dictAspect'forbeanclass[org.jxbd.common.aspect.DictAspect]conflictswithexisting,non-compatiblebeandefinitionofsamenameandclass[org.jeecg.common.aspect.DictAspect] classpathresource[org/j......