概况
本文主要介绍Java注解(Java Annotation)的概念、类型及使用等知识。
概念
基本知识
- Java编程语言里,Java注解是一种可以被添加到Java源码里的元数据(
metadata
),尽管它们不是程序的一部分 - 类(
Classes
)、方法(methods
)、变量(variables
)、参数(parameters
)和包(packages
)都可以被注解 - Java注解从JDK 1.5开始被加入到Java中
- Java注解对程序的执行没有影响
注解形式
- 使用
@
来告诉编译器,如@Entity
告诉编译器注解的名字是Entity 注解可以包含元素
这些元素对名称没有要求,可以有值,如
12345{name = "Benjamin Franklin"data = "3/27/2003"}class MyClass {...}如果只有一个带值的元素,其名称可以被忽略,如
12"unchecked")(voido myMethod() {...}如果没有元素,圆括号可以去掉,如
@Override
在同一定义上也可以使用多个注解,如
123"Jane Doe")(name=class MyClass {...}如果注解有同一类型,则被称为重复注解(
repeating annotation
)
类型
许多注解类型在Java SE API
里预定义,一些注解类型用于Java编译器,一些应用到其它注解
应用到Java代码的注解
也称为内置注解(Built-in Annotations
)
@Override
:告知编译器该元素是为了覆盖定义在父类的元素,如果一个方法在父类或被实现接口中没有被发现,会引起编译器报错。如当覆盖子类的一个方法时,应该使用@Override
来标记该方法,这样可以让代码可读,并且避免维护问题,例如当修改父类的方法签名时,开发人员必须修改子类中该方法的签名,否则编译器会抛出编译错误。当没有使用@Override
时,会很难追踪到错误位置。见下面例子12345678public class MyParentClass {public void justMethod() {...}}public class MyChildClass extends MyParentClass {public void justMethod() {...}}@Deprecated
:提示标记的元素(类、方法或域)过时了,应该不再使用。无论何时程序使用已经使用@Deprecated
注解标记的方法、类或域时,编译器生成一个警告@SuppressWarnings
:指示编译器忽略特殊的警告。如当在调用过时的方法(假定该方法使用@Deprecated
标记)时,使用@SuppressWarnings
注解来禁止派生的警告,如下代码所示12"deprecation")(void method() {...}@SafeVarargs
:在Java SE 7
中引入,当应用到方法或构造函数时,声称代码不对其可变参数(varargs
)的参数进行潜在的不安全操作。当该注解类型被使用时,关联到可变参数的unchecked
警告被禁止@FunctionalInterface
:在Java SE 8
中引入,表明此类型声明是一个功能性接口
应用到其它注解的注解
也称为元注解(Meta Annotations
)
@Retention
:具体说明标记的注解如何被存储- RetentionPolicy.SOURCE:保留在源码里,被编译器忽略
- RetentionPolicy.CLASS:被编译时的编译器保留,但被
JVM
忽略 - RetentionPolicy.RUNTIME:被
JVM
保留,可以在运行时环境被使用(通过反射)
@Documented
:指明使用该注解的元素应该使用javadoc
工具记录@Target
:具体说明可以在何处使用该注解,如定义目标类型为METHOD
,意味着该注解只能用在方法上- ElementType.ANNOTATION_TYPE:用于注解类型
- ElementType.CONSTRUCTOR:用于构造函数
- ElementType.FIELD:用于域或属性
- ElementType.LOCAL_VARIABLE:用于局部变量
- ElementType.METHOD:用于方法
- ElementType.PACKAGE:用于包的定义
- ElementType.PARAMETER:用于方法的参数
- ElementType.TYPE:用于类的任意元素
1234567({ElementType.METHOD})public MyCustomAnnotation {}public class MyClass {public void myMethod() { // do sth }}@Inherited
:指明在一个类里被使用的自定义注解应该被所有的子类继承,如下所示1234567public MyCustomAnnotation {}public class MyParentClass {}public class MyChildClass extends MyParentClass {}@Repeatable
:在Java SE 8中引入,具体指明该注解可以用于同一定义多次,如下所示123"Jane Doe")(name="John Smith")(name=class MyClass {...}
使用
- 编译器信息:
Information for the compiler
,被编译器用来检测错误或禁止警告;在Java中有三个内置的可用的注解(@Deprecated
,@Override
和@SupressWarning
),能被用来提供某种指示给编译器 - 编译时和部署时处理:
Compile-time and deployment-time processing
,软件工具可以处理注解信息来生成代码、XML文件等等 - 运行时处理:
Runtime processing
,一些注解可用于在运行时被检测