java 注解的使用
契机
一直以来做spingboot项目开发的时候,springboot的自定义注解用起来很是方便,但是对注解背后的原理总是懵懵懂懂的,知其然不知其所以然。这次借着做作业的机会,决定探究一下注解的原理和如何自定义注解,好好满足一下自己的好奇心。
适用范围
JDK 1.8
什么是注解?
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。一些情况下,我们可以通过反射机制来获取标注的内容。通常来说,注解不影响代码的执行,但是极少数情况下我们可以利用注解来影响代码的执行。
元注解
有一类注解比较特殊。它们是用来注解的注解,或者说,用来标注其他注解。在JDK1.8中,这些注解有五个,称为元注解
功能表
元注解 | 功能 |
---|---|
@Retention |
该元注解用于标注其他注解的生命周期。注解可以存在于源码(编译)、字节码(类加载)或JVM(运行)中 |
@Target |
该元注解用于标注其他注解可标注的类型。例如接口、类、枚举、注解、属性字段、枚举常量、方法、方法参数、构造函数、泛型甚至是包 |
@Documented |
该元注解用于将注解中的元素包含到 Javadoc 中 |
@Inherited |
一个被@Inherited标注了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。 |
@Repeatable |
该元注解标注的注解可以同时作用一个对象多次,但是每次作用时又可以代表不同的含义。 |
可选参数
元注解 | 可能的参数 |
---|---|
@Retention |
RetentionPolicy.SOURCE ,RetentionPolicy.CLASS ,RetentionPolicy.RUNTIME |
@Target |
ElementType.TYPE(接口、类、枚举、注解) ,ElementType.FIELD(属性字段、枚举常量) ,ElementType.METHOD(方法) ,ElementType.PARAMETER(方法参数) ,ElementType.CONSTRUCTOR(构造函数) ,ElementType.LOCAL_VARIABLE(局部变量) ,ElementType.ANNOTATION_TYPE(注解) ,ElementType.PACKAGE(包) ,ElementType.TYPE_PARAMETER(泛型,即泛型方法、泛型类、泛型接口) ,ElementType.TYPE_USE(除了class以外的任意类型) |
示例
//自定义注解timeLimit
//Retention注解用于标明自定义注解的生命周期。当其值为RetentionPolicy.RUNTIME时,自定义注解在运行阶段仍存在于虚拟机中,可以通过反射机制来读取其中内容
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)//Target注解用于标明自定义注解可标注的类型。其值为ElementType.METHOD时,自定义注解可标注于方法上
@interface timeLimit{
int value() default 0;
}