基本元素
任意打开一个注解都可以发现有基本的三个注解
翻译一下:
Retention 保留,保持
Documented 记录
Target 目标
ElementType 元素类型
RetentionPolicy 保留 政策
@Target
进入@Target注解查看介绍,这个是用来指定该注解适用范围的,ElementType进入后是一个枚举类,提供各种适用范围
从这里可以看得出传入的参数可以是该枚举类的数组形式,也就是支持多种类型,写入时可以在数组 { }中使用 , 分割,填写多个值。
而且@Target中存在值的情况下会强制去执行使用限制。
如果注释类型{@code@Target}上不存在{@code@Target}元注释,类型为{@code T}的注释可以作为除类型参数声明之外的任何声明的修改器来编写。
进入枚举类,ElementType提供如下:
TYPE
类,接口(包含注释类型的接口),枚举上声明
FIELD
一般成员属性(包含枚举)上声明
METHOD
方法上声明
PARAMETER
形式参数上声明
CONSTRUCTOR
构造函数上声明
LOCAL_VARIABLE
局部变量上声明
ANNOTATION_TYPE
注解上声明
PACKAGE
包上声明
TYPE_PARAMETER
类型参数声明
TYPE_USE
类型的使用?(翻译后是 字体的使用)
@Retention
进入源码查看介绍了解到这个保留指的是这个注解的保留时长,如果没有提供值则默认采用RetentionPolicy.CLASS
且该注解仅在元注解类型直接用于注解时有效。如果元注释类型用作其他注释类型中的成员类型,则它无效。
看的出来,这个保留政策(或者说保留时长的策略)只能采用一种,不能多个。
进入枚举类后只提供了三种类型
SOURCE
编译器将丢弃注解(指的应该是只在编译阶段存活)
CLASS
由编译器记录在CLASS文件中,不在运行时由VM(虚拟机)保留。默认时为该模式。
RUNTIME
注释将由编译器记录在CLASS文件中,并在运行时由VM获取,因此可以反射地读取它们。
@Documented
指示默认情况下,Javadoc和类似工具将记录具有类型的注释。此类型应用于注释其注释影响其客户端使用注释删除的类型的删除。如果使用Documented对类型声明进行注释,则其注释将成为注释元素的公共API的一部分。
不需要传值,功能性注释。
实际定义尝试,注解同样可以携带属性
属性可以为一般的数据类型,也可以是自定义的类 或者枚举等。
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation{
String comment() default "";
int mill() default 0;
String[] team() default {};
Class beanClass() default Object.class;
boolean rightOr() default false;
}
在某一方法上定义
@MyAnnotation(comment = "45454", mill = 10, team = {"wo", "44845"}, rightOr = true)
public void testMethod(){
}
类似的可以参考 spring携带的注解以及其他框架携带的注解