文章目录
参考资料
- Java中的注解是如何工作的?
- Java基础加强总结(一)——注解(Annotation)
- Java注解教程
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Language Specification - Chapter 9. Interfaces
- Java魔法堂:注解用法详解——@SuppressWarnings
源码地址
概述
对于注解
而言,可以用一个词描述,那就是元数据
,即一种描述数据的数据。Annotations仅仅是元数据,和业务逻辑无关。Annotations仅仅提供它定义的属性(类/方法/包/域)的信息。
Annotations的使用者(javac编译器、开发工具和其他程序)来读取这些信息并实现必要的逻辑。
Annotation
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
Annotation是所有注解类型的公共接口,而且所有的注解必须实现这个接口。需要注意的是,由于注解类型声明是一种特殊的接口声明。为了区分注解类型声明与普通接口的声明,在关键字前面添加了@
用以区别,即@infterface
。 例如:
public @interface A {
}
上面代码中,声明了注解A
,通过@infterface
表明其实现了Annotation
接口及其是一个注解类。
元素
注解的本身是一种数据类型,是Annotation
的实现类,当然也可以在其内声明被称为元素
的成员。与普通数据类型不同的是,注解类型通过方法声明
定义注解类型的元素。例如:
public @interface B {
String name();
int version();
}
在注解B
中,声明了两个元素name
和version
,它们都是通过方法声明
的。
值的注意的是:
- 注解类型可以包含零个或多个元素。
- 注解类型的元素的数据类型为:基本类型、字符串(String)、类、类的任何参数化调用、枚举类型、注解类型或数组类型。
- 在注解类型中声明的任何方法不能覆盖在类Object或接口
java.lang.annotation.Annotation
中声明的任何公共或受保护的方法,否则出现编译时错误。 - 注解类型不能直接或间接泛型元素,否则出现编译时错误。
默认值
注解类型元素可以为其指定的默认值。在指定默认值时使用使用关键字default
和元素的默认值(空值或值列表)。其中
- 未指定默认值的元素,必须在使用时对该元素赋值。
- 给定的元素默认值的数据类型必须与元素的数据类型一致。
例如:
public @interface C {
String name() default "tea";
int version();
}
@C(version = 1)
public class CC {
@C(name = "2", version = 2)
String a;
}
在注解类型C
,中声明了两个元素name
和version
,其中,name
指定了默认值tea
。当使用C
时,可以不对元素name
赋值。当未对元素version
赋值时,IDE会报错,提示"version是必要的但是没有找到",也就意味着未指定默认值的元素,必须在使用时对该元素赋值。
用途
注解有多种用途,包括:
- 向编译器提供信息 —— 编译器使用注解检查错误或忽略警告
- 编译时和部署时处理 —— 注解处理工具可以处理注解信息来生成代码,XML文件等等
- 运行时处理 —— 一些注解在运行时进行审查
元注解
在注解类上使用另一个注解类,那么被使用的注解类就称为元注解.
Java SE API预定义了一组注解类型。某些注解用于Java编译器,一些适用于其他注解。
- @Documented
- @Target
- @Retention
- @Inherited
- @Override
- @SuppressWarnings
- @Deprecated
- @SafeVarargs
- @FunctionalInterface
- @Repeatable
@Documented
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Documented
用于注解类型的声明,表示是否将注解信息添加在java文档中。如果将@Documented
用于注解类型声明,那么该注解将成为javadoc的API中.声明Annotation时,@Documented
可有可无;若没有定义,则Annotation不会出现在javadoc中。
@Target
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
public enum ElementType {
// 用于描述类、接口或enum声明
TYPE,
// 用于描述实例变量
FIELD,
// 用于描述方法
METHOD,
// 用于描述参数
PARAMETER,
// 用于描述