1 注解接口
注解是由注解接口来定义的:
modifiers @interface AnnotationName {
elementDeclaration1
elementDeclaration2
}
注解接口隐式扩展自 Annotation 接口,无法扩展注解接口。
元素
元素声明
type elementName();
type elementName() default value;
type elementName() = value;
合法元素
- 基本类型
- String
- Class(具有一个可选类型参数)
- enum
- 注解类型
- 上述类型数组
元素不能为null
2 注解
每个注解都具有下面这种格式:
@AnnotationName(elementName1=value1, elementName2=value2, ...)
因为注解是由编译器计算而来的,因此,所有元素值必须是编译期常量。
一个项可以有多个注解,如注解作者将其声明为可重复的,则可重复使用同一个注解。
3 注解各类声明
注解可用在:
包、类、接口、方法、构造器、实例域、局部变量、参数变量、类型参数
4 注解类型用法
- 泛化类型引元
List<@NonNull String>
- 数组
@NonNull String[][]
String @NonNull [][]
String[] @NonNull []
- 超类实现接口
Class Warning extends @Localized Message
- 构造器
new @Localized String()
- 强制转换
(@Localized String)text
- 类型检查
if(text instanceof @Localized String)
- 异常规约
public String read() throws @Localized IOException
- 通配符
List<@Localized ? extends Message>
List<? extends @Localized Message>
- 方法构造器引用
@Localized Message::getText
5 注解 this
用语法变体显示化接收器参数 this,再注解
public class Point{
public boolean euqals(@ReadOnly Point this,@ReadOnly other){
...
}
}