什么是注解?
-
插入到源码中用于某种工具处理的标签。
-
注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。
-
在Java中,注解是当作一个修饰符来使用的,它被置于备注解项之前,中间没有分号
-
每一个注解的名称前面都加了@符号,类似Javadoc的注解,Javadoc注解出现在 /***...*/ 定界符的内部,而注解是代码的一部分。
-
和注释一样,注解不影响程序逻辑,但注解可以被编译或者运行,相当于嵌入代码中的补充信息
定义注解
modifiers @interface AnnotationName {
element declaration1
element declaration2
. . .
}
注解@interface不是接口是注解类
每个元素声明具有如下形式
type elementName();
// 或者
type elementName() default value;
举例:
// 例如,下面的注解具有两个元素
public @interface BugReport {
String assignedTo() default "[none]"
int severity = 0
}
每个注解具有下面的格式
@AnnotationName(elementName1=value1, elementName1 = value2, . . .)
// 举例
@BugReport(assignedTo="Harry", severity=10)
有两个特殊的快捷方式用来简化注解
-
没有指定元素(没有元素或者默认值),称为 标记注解
@BugReport // <=> @Bugreport(assignedTo="[none]", severity=0)
-
单值注解,如果一个元素具有特殊名字 value,并且没有指定其他元素,可以忽略元素名和等号
// ActionListenerFor 注解定义如下 public @interface ActonListenerFor { String value(); } // 可以书写为 @ActionListenerFor("yellowButton") // 而不是 @ActionListenerFor(value="yellowButton")
三个基本的Annotation
- @Override:限定某个方法,是重写父类方法,该注解只能用于方法
- @Deprecated:表示某个程序元素(类,方法等)已经过时
- @SuppressWarnings:抑制编译器警告
@Override
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
- @Override 表示会重写父类的方法(编译层面验证)如果父类没有这个方法则会报错
- 只能修饰方法,不能修饰其他类、包、属性等(后面介绍)
@Deprecated
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
- 修饰某个元素,表示该元素已经过时
- 不推荐使用,但仍可以使用,用于版本过渡等
@SuppressWarnings
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
-
当我们不希望看到某些警告的时候,可以使用该注解来抑制警告信息
-
在{""}中可以写入希望抑制的警告信息
-
可以指定警告信息
all:抑制所有警告 boxing:抑制与封装/拆装作业相关的警告 cast:抑制与强制转型相关的警告 dep-ann:抑制与淘汰注释相关的警告 deprecation:抑制与淘汰相关的警告 fallthrough:抑制与switch陈述式中遗漏break相关的警告 finally:抑制与未传回finally区块相关的警告 hiding:抑制与隐藏变数的区域变数相关的警告 incomplete-switch:抑制与switch陈述式(enum、case)中遗漏项目相关的警告 javadoc:抑制与javadoc相关的警告 nls:抑制与非nls字符串文字相关的警告 null:抑制与空值分析相关的警告 rawtypes:抑制与使用raw类型相关的警告 resource:抑制与使用Closeable类型的资源相关的警告 restriction:抑制与使用不建议或禁止参照相关的警告 serial:抑制与可序列化的类别遗漏serialVersionUID栏位相关的警告 static-access:抑制与静态存取不正确相关的警告 static-method:抑制与可能宣告为static的方法相关的警告 super :抑制与置换方法相关但不含super呼叫的警告 synthetic-access:抑制与内部类别的存取未最佳化相关的警告 sync-override:抑制因为置换同步方法而遗漏同步化的警告 unchecked:抑制与未检查的作业相关的警告 unqualified-field-access:抑制与栏位存取不合格相关的警告 unused:抑制与未用的程序码及停用的程序码相关的警告
元注解
- 注解的注解(用来修饰其他的注解)
四种
@Retention
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
-
只能修饰一个注解定义,指定该注解保留多长时间
-
包含一个RetentionPolicy类型的成员变量,使用该注解时必须为该 value 成员变量指定值
@Retention 的三种值
- @RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注解
- @RetentionPolicy.CLASS:编译器把注解记录在class文件中,当运行java程序时,JVM不会保留注解,这是默认值
- @RetentionPolicy.RUNTIME:编译器把注解记录在class文件中,当运行java程序时,JVM会保留注解,程序可以通过反射获取该注解
@Target
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE,
TYPE_PARAMETER,
TYPE_USE
}
修饰Annotation定义,用于指定被修饰的注解能用于修饰哪些程序元素
@Document
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
用于指定被该元注解修饰的注解类将被javadoc工具提取成文档,即在生产文档时,可以看到该注解
说明,定义为@Document的注解必须设置为Retention值为RUNTIME
@Inherited
@Documented
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})
public @interface Interned {
}
被它修饰的注解将具有继承性,如果某个类使用了被@Inherited修饰的注释,则其子类将自动具有该注解。