博客
关于我
java注解完整实例
阅读量:534 次
发布时间:2019-03-09

本文共 3044 字,大约阅读时间需要 10 分钟。

Java注解实战:手动创建一个长度校验的注解

在开发过程中,我们常常需要对字段的长度进行验证。这时候,Java自定义注解就派上用场了。通过创建一个自定义的@Length注解,我们可以方便地在代码中标注校验条件,并灵活选择使用方式。

什么是注解?

注解(Annotation)是一种标记元数据的方式,用于为代码中的类、字段、方法等元素提供额外的信息。其本质作用是为代码的某些特定部分提供标识,方便后续的处理或生成。通过注解,我们可以在运行时动态获取标注信息,从而执行诸如代码生成、数据校验等自动化工作。

动手造一个注解

目标是手动创建一个@Length注解,用于校验字段的长度。接下来,我们将从定义注解开始,逐步完成一个最小步骤的实现。

定义注解

使用注解时,通常需要选择使用与约束注解配合的验证器方式,或者结合AOP(面向切面编程)方式。这里我们从验证器方式入手。

第一步:定义注解
@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {LengthValidator.class})public @interface Length {    int min();    int max();    String message() default "长度超过限制";}
  • @Target(ElementType.FIELD):指定该注解适用于字段。
  • @Retention(RetentionPolicy.RUNTIME):保留到运行时,可通过反射获取。
  • @Documented:将注解信息包含到Javadoc中。
  • @Constraint(validatedBy = {LengthValidator.class}):与约束注解关联指定的验证器。
第二步:定义验证器
public class LengthValidator implements ConstraintValidator
{ private Integer min; private Integer max; @Override public void initialize(Length constraintAnnotation) { min = constraintAnnotation.min(); max = constraintAnnotation.max(); } @Override public boolean isValid(Object object, ConstraintValidatorContext context) { if (object == null) { return true; } if (object instanceof String) { int length = ((String) object).length(); return (length >= min && length <= max); } return false; }}

验证器继承自ConstraintValidator<Length, Object>接口,实现initializeisValid方法,即可完成增强型注解的校验功能。

第三步:使用注解

在实际应用中,先定义一个实体类,并在字段上添加注解。

public class AdminDTO {    private Integer id;    @Length(min = 1, max = 3)    private String username;    private String password;}

在需要校验的位置,使用@Validated注解触发校验过程:

@RequestMapping("/login")public R login(@RequestBody @Validated AdminDTO adminDTO) throws Exception {    // 校验逻辑...    return null;}

通过以上步骤,我们成功创建并使用了一个基于验证器的@Length注解。

AOP方式

如果你更倾向于灵活的方式,可以选择使用AOP来实现注解的功能。你需要编写一个拦截器来执行校验逻辑。

定义注解

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface LengthAop {    int min();    int max();    String errorMsg();}
定义拦截器
public class LengthAopValidator implements Tomas Peterson {    public String isValid(Object object) throws IllegalAccessException {        Field[] fields = object.getClass().getDeclaredFields();        for (Field field : fields) {            if (field.isAnnotationPresent(LengthAop.class)) {                LengthAop annotation = field.getAnnotation(LengthAop.class);                field.setAccessible(true);                Object value = field.get(object);                if (value instanceof String) {                    int len = ((String) value).length();                    if (len < annotation.min() || len > annotation.max()) {                        return annotation.errorMsg();                    }                }            }        }        return null;    }}

实现spring``Tomas Peterson拦截器,通过AOP的方式进行注解校验。

总结

通过以上步骤,我们掌握了在Java中手动创建注解的方法,并学会了两种不同的校验方式。无论是基于验证器的方式,还是结合AOP实现的拦截器,都能能够满足不同场景的需求。接下来,你可以根据实际项目需求,选择最符合的实现方式,灵活运用注解来提高代码的可维护性和复用性。

转载地址:http://ahusz.baihongyu.com/

你可能感兴趣的文章
Leetcode第557题---翻转字符串中的单词
查看>>
Problem G. The Stones Game【取石子博弈 & 思维】
查看>>
Unable to execute dex: Multiple dex files
查看>>
Mac电脑调用自带的命令行窗口
查看>>
eclipse自动补全代码(Auto activation只能输3个字符)
查看>>
Java多线程
查看>>
Unity监听日记
查看>>
AndroidStudio跳到错误位置
查看>>
ARFoundation系列讲解-03申请苹果开发者账号
查看>>
木马开发的基本理论基础(五)
查看>>
openssl服务器证书操作
查看>>
expect 模拟交互 ftp 上传文件到指定目录下
查看>>
Matplotlib绘制分组聚合流程图
查看>>
Java 中的多态详解
查看>>
linux系统下双屏显示
查看>>
PDF.js —— vue项目中使用pdf.js显示pdf文件(流)
查看>>
我用wxPython搭建GUI量化系统之wx.Toolbar实现工具栏
查看>>
我用wxPython搭建GUI量化系统之wx.TextCtrl实现文本框
查看>>
我用wxPython搭建GUI量化系统之最小架构的运行
查看>>
我用wxPython搭建GUI量化系统之Sizer布局管理与页面切换
查看>>