Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据[1]。
Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容[2]。 当然它也支持自定义Java标注[3]。
Java 平台有许多特别的注解,例如 transient 修饰符,@deprecated javadoc 标签。2002 年,文案 JSR-175 提出了通用需求的注解(或者说元注解)手段,并在 2004 年 9 月收到许多人的赞赏。[4]从 JDK 1.5 开始,java 开始支持注解。Annotation Processing tool (或者说 apt tool) 提供了一个补充性的编译时注解操作的接口。文档 JSR-269 将它规范化,在 JDK 1.6 写入编译器 javac 中。
@deprecated
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中[5][6]
作用在代码的注解是:
作用在其他注解的注解(或者说 元注解)是:
从 Java 7 开始,额外添加了 3 个注解:
// @Twizzle标注toggle()方法。 @Twizzle public void toggle() { } // 声明Twizzle标注 public @interface Twizzle { }
标注可以包含一个关键字和值的对所构成的列表:
//等同于 @Edible(value = true) @Edible(true) Item item = new Carrot(); public @interface Edible { boolean value() default false; } @Author(first = "Oompah", last = "Loompah") Book book = new Book(); public @interface Author { String first(); String last(); }
标注声明中可以用标注说明使用方式、时间和对象:
@Retention(RetentionPolicy.RUNTIME) // 该标注可以在运行时通过反射访问。 @Target({ElementType.METHOD}) // 该标注只用于类内方法。 public @interface Tweezable { }
编译器保留一组标注用于特定语法目的 (包括 @Deprecated, @Override和@SuppressWarnings等)。
标注通常用于软件框架为用户定义的类和方法提供引用外部资源的情形,如XML配置文件、事务环境等。以下是一个标注过的EJB 3.0的类:
@Entity // 声明实体类 @Table(name = "people") // 映射该类到 "people"表 class Person implements Serializable { @Id // 映射到主键 @GeneratedValue(strategy = GenerationType.AUTO) // 数据库自动生成键值 private Integer id; @Column(length = 32) // 限长32个字符 private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
以上代码中标注不执行任何特定行为,而是为在运行时,EJB容器获得足够的信息,生成对象到关系数据库的映射。