注解接口
注解是由注解接口来定义的
modifiers @interface AnnotationName{
element1
element2
}
对于其中的每一个元素,声明时应该按照以下两种形式
//normal
type elementName();
//with default value
type elementName() default value;
比如一个“苹果”注解
public @interface Apple {
String color() default "red";
int count();
}
所有的注解接口都隐式地扩展自java.lang.annotation.Annotation接口,由于Java不支持多重继承机制,所以你无法扩展注解接口
注解的类型可以是下列之一
- 基本类型
- String
- Class
- enum类型
- 注解类型
- 由以上类型组成的数组(数组组成的数组不是合法的类型,当然,你不会想这么做)
注解
注解在使用时的格式是@AnnotationName(element1 = value1, element2 = value2,...)
,其中元素的顺序无关紧要,当其中某个元素的值未指定,那么就会使用声明的默认值
需要注意的时,在使用默认值时,默认值并不和注解存储在一起。简单的说,假如你修改了某个注解接口中的默认值,之后重新编译接口,之前使用了该接口的文件将使用新的默认值,就算它没有被重新编译
在使用时如果如果没有指定元素那么就不需要使用括号了,比如@Annotation
,这样的注解又称为标记注解,另一种快捷的方式叫单值注解,如果注解的元素中只有一个,并且具有一个特殊的名字value
,就可以使用@Annotation("value1")
注解声明
注解可以出现在许多地方,比如以下
- 包
- 类(包括 enum)
- 接口(包括注解接口)
- 方法
- 构造器
- 实例域(包含 enum 常量)
- 局部变量
- 参数变量
- 类型参数
对于类和接口,需要将注解放置在class和interface关键字的前面
对于变量,需要将注解放置在类型的前面
泛化类或方法中的类型参数可以像下面这样被注解
public class Name<@Annotation V>
包是在文件package-info.java中注解的