1 什么是注解
- 注解(Annotation)是JDK5.0开始引入的新技术
- 注解不是程序本身,但可以对程序作出解释(类似注释(comment))
- 注解可以被其他程序(例如编译器等)读取
- 注解以
@注解名
的形式存在于代码中,还可以添加一些参数值,例如@SuppressWarnings(value="unchecked")
- 注解可以用在package,class,method,field等上,相当于为它们添加了额外的辅助信息,可以通过反射实现对这些元数据的访问
2 内置注解
@Override
:定义在java.lang.Override
中,用于修饰方法,表示一个方法打算重写超类中的一个方法@Deprecated
:定义在java.lang.Depercated
中,可用于修饰方法、属性、类,表示不鼓励程序员使用这些代码,通常是因为它们很危险或者有更好的选择@SuppressWarnings
:定义在java.lang.SuppressWarnings
中,用于抑制编译时的警告信息,此注解需要添加参数才能正确使用@SuppressWarnings("all")
@SuppressWarnings("unchecked")
@SuppressWarnings("value={"unchecked", "deprecation"}")
- 等等……
3 元注解
-
元注解(meta-annotation)的作用是负责注解其他注解,Java定义了4个标准的元注解类型,为其他注解类型提供说明
-
元注解和其支持的类可以在
java.lang.annotation
包中找到-
@Target
:用于描述注解的使用范围,其取值范围定义在ElementType
枚举中public enum ElementType { TYPE, // 类、接口、枚举类 FIELD, // 成员变量(包括枚举常量) METHOD, // 成员方法 PARAMETER, // 方法参数 CONSTRUCTOR, // 构造方法 LOCAL_VARIABLE, // 局部变量 ANNOTATION_TYPE, // 注解类 PACKAGE, // 包 /** * 类型注解 * @Since 1.8 */ TYPE_PARAMETER, TYPE_USE }
-
@Retention
:用于描述注解保留的时间范围(生命周期),共3种策略,定义在RetentionPolicy
枚举中public enum RetentionPolicy { SOURCE, // 编译时会被丢弃,仅在源码中存在 CLASS, // 默认策略,运行时会被丢弃,仅在class文件中 RUNTIME // 编译时将注解信息记录到class文件,运行时仍然保留,可通过反射获取注解信息 }
-
@Documented
:说明该注解将被包含在javadoc中 -
@Inherited
:说明子类可以继承父类中的该注解
-
4 自定义注解
-
使用
@interface
自定义注解,其自动继承java.lang.annotation.Annotation
接口 -
分析:
-
@interface
用于声明一个注解,格式为public @interface 注解名 {定义内容}
-
自定义注解中只能定义注解类型元素(annotation type element),其语法为:
public @interface MyAnnotation { public String name(); int age() default 18; int[] array(); String[] schools() default {"北京大学", "清华大学"}; }
-
注解类型元素的访问修饰符必须为
public
,不写默认为public
-
注解类型元素的类型只能是基本类型、
Class
、String
、枚举类型和注解类型,以及上述类型的一维数组 -
可通过
default
声明参数的默认值,该值的类型必须与上一条中定义的类型一致 -
如果只有一个注解类型元素,一般注解类型元素名为
value
-
()
不是定义方法参数的地方,也不能在括号中定义任何参数,仅仅是一个特殊的语法
-
5 注解的特殊语法
- 如果注解本身没有注解类型元素,那么在使用注解时可以省略括号,直接写为
@注解名
,其等价于@注解名()
- 如果注解本身只有一个注解类型元素,且命名为
value()
,在使用注解时可以直接使用@注解名(注解值)
,其等价于@注解名(value = 注解值)
- 如果注解中的某个注解类型元素是一个数组类型,但使用时仅需要填入一个值,那么可以直接写为
@注解名(类型名 = 类型值)
,其等价于标准写法@注解名(类型名 = {类型值})