注解接口

注解是由注解接口来定义的

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中注解的