Java注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序加上某种标记。可以通过 反射 来获取类上面的标记,程序可以通过标记去做相应的事。
标记可以加在包,类,属性、方法,方法参数,局部变量上。
自定义注解通过 @interface 实现,如下所示:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogOperation { /** * 定义基本属性:color * 应用属性:@LogOperation(color="red") */ String color(); /** * 为属性指定缺省值(默认值) * 语法:类型 属性名() default 默认值 */ String name() default ""; /** * 如果一个注解中有一个名称为value的属性,且只想设置value属性(即其他属性都采用默认值或者只有一个value属性),那么可以省略掉“value=”部分 * 用法:@LogOperation("111") */ String value(); }
Jdk1.5开始提供了四个元注解,用于新注解的创建:@Target、@Retention、@Document、@Inherited
@Target:作用范围(类、方法、字段等),表示该注解可以用于什么地方
参考值类ElementType:
CONSTRUCTOR
:构造器的声明
FIELD
:域声明(包括enum
实例)
LOCAL_VARIABLE
:局部变量声明
METHOD
:方法声明
PACKAGE
:包声明
PARAMETER
:参数声明
TYPE
:类、接口(包括注解类型)或enum
声明
@Retention:生命周期,表示需要在什么地方保存该注解信息,一个注解的生命周期有三个阶段:java源文件是一个阶段,class文件是一个阶段,内存中的字节码是一个阶段
参考值类RetentionPolicy:
SOURCE
:在源文件中有效(即源文件保留,注解只在java源文件中存在,编译成.class文件后注解就不存在了)注解将被编译器丢弃
CLASS
:在class文件中有效(即class保留,注解在java源文件(.java文件)中存在,编译成.class文件后注解也还存在)注解将被VM(虚拟机)丢弃
RUNTIME
:在运行时有效(即运行时保留,程序运行时都存在)VM(虚拟机)将在运行期间保留注解,可以通过反射机制读取注解信息
@Document:将注解包含在Javadoc中,此注解会被javadoc工具提取成文档
@Inherited:允许子类继承父类中的注解,只能是类上的注解,方法和字段的注解不能被继承。即如果父类上的注解是@Inherited修饰的就能被子类继承
Jdk1.8又提供了两个元注解:
@Native:指定字段是一个常量,其值引用native code
@Repeatable:将注解包含在Javadoc中
Jdk1.5之后内部提供了三个注解:
@Deprecated:意思是“废弃的,过时的”
@Override:意思是“重写、覆盖”
@SuppressWarnings:意思是“压缩警告”