注解这个东西自从SpringBoot以来一直是Java开发者们必备的生存技巧呀,我们平时几乎大部分时间都是面向注解编程,通过注解我们可以节约大量的时间。用过了这么多的注解,那么我们否有关注过注解的实现原理呢?所以本篇文章主要是讲述注解的有关操作,自己实现一个注解来体会注解的实现原理,注解也不是特别高深的东西,掌握了自然就明白了。
注解的基本原理
注解本来的意思就是用来做标注用:可以在类、字段变量、方法、接口等位置进行一个特殊的标记,为后续做一些诸如: 代码生成、数据校验、资源整合等工作做铺垫。所以注解就是做标记用的,注解一旦对代码标注完成,后续就可以结合Java强大的反射机制,在运行时动态地获取到注解的标注信息,从而可以执行很多其他逻辑,完成我们想要的自动化工作。所以,反射机制很重要。
注解的使用示例
假设我们现在有个Person类,这个Person类要当做参数传入,我们要对参数进行校验:
1 | public class Person { |
如果没有注解,那么我们就需要写这样一长串的if else校验:
1 | public String addPerson(Person person){ |
所以,可以参考一下如何使用注解来校验这些参数:
1 | public class Person { |
@Length注释的实现
本篇文章中,我们就来实现一下@Length这个注解,这个注解学会了,其他注解也都是一样的:
step1.定义注解 @Length
1 | import java.lang.annotation.ElementType; |
1、注解的定义有点像定义接口interface,但唯一不同的是前面需要加一个@符号
2、注解的成员变量只能使用基本类型、String或者enum枚举,比如int可以,但Integer这种包装类型就不行
3、像上面@Target、@Retention这种加在注解定义上面的注解,我们称为“元注解”, 元注解就是专门用于给注解添加注解的注解,简单理解就是:元注解就是天生就有的注解,可直接用于注解的定义上
4、@Target(xxx)用来说明该自定义注解可以用在什么位置,比如:
- ElementType. FIELD:说明自定义的注解可以用于类的变量
- ElementType. METHOD:说明自定义的注解可以于类的方法
- ElementType. TYPE:说明自定义的注解可以用于类本身、接口或enum类型
- 其实还有很多,如果记不住的话还是建议现用现查
5、@Retention (xxx)用说明你自定义注解的生命周期,比如:
- @Retention (RetentionPolicy.RUNTIME):表示注解可以一直保留到运行时,因此可以通过反射获取注解信息
- @Retention (RetentionPolicy.CLASS):表示注解被编译器编译进class文件,但运行时会忽略
- @Retention (RetentionPolicy.SOURCE):表示注解仅在源文件中有效, 编译时就会被忽略
所以声明周期从长到短分别为:RUNTIME > CLASS > SOURCE,一般来说,如果需要在运行时去动态获取注解的信息,还是得用RUNTIME,就像本文所用。
step2.获取注解并对其验证
在运行时想获取注解所代包含的信息,该怎么办?我们得用Java的反射相关的知识!下面写了一个验证函数validate(),代码中会逐行用注释去解释想要达到的目的,认真看一下每一行的注释:
1 | public class LengthValidator { |
step3.使用自定义注解
此时,Person类只需要加上此注解
1 | public class Person { |
然后使用即可:
1 | public class AnnotationTest { |
- 本文作者: Tim
- 本文链接: https://zouchanglin.cn/2020/04/12/607028132.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!