Java 注解
1. 简介
注解是Java 1.5 引入的新特性,它为我们在代码中添加信息提供了一种形式化的方法,我们可以在后续的某个时刻方便的使用这些数据。
注解的语法非常简单,除了使用@符号之外,基本与Java固有的语法保持一致,在Java1.5中内置了三种注解,定义在java.lang中:
@Override:表示当前的方法将覆盖超类中的方法
@Deprecated:表示被其注释的元素已经被抛弃,不应该使用
@SuppressWarnings:关闭某些编译器警告
2. 元注解
在定义注解时,会需要另一个注解类,这个“另一个注解类”就叫做元注解,目前Java内置了三种元注解,专门负责注解其他注解:
@Target:表示该注解可以用于什么地方,参数取值为:
CONSTRUCTOR:构造器声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
@Retention:表示需要在什么级别保存该注解信息,可选的参数为:
SOURCE:注解将被编译器丢弃
CLASS:注解在class文件中可用,但会被VM丢弃
RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息
@Documented:将此注解包含在JavaDoc中
@Inherited:允许子类继承父类中的注解
3. 自定义注解
自定义注解一般的使用包含以下三个方面:定义注解类、应用注解类去注解、反射操作。
定义注解类与定义一般的接口类似,只需要加上@标志即可,如下代码:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) //注解可以被反射使用 @Target({ElementType.METHOD, ElementType.TYPE}) //可以用于类、方法 public @interface MyAnnotation { String color(); String value() default "VALUE"; int[] array() default {1, 2, 3}; }
注解定义后,必须通过反射解析才能发挥注解的作用,将自定义注解应用于类名AnnotationUse和方法use()上,然后通过反射操作分别解析出了两处注解。第一处注解作用于类上,所以必须通过类class来获取该注解,第二处注解应用于方法上,所以需要通过方法来获取。代码如下:
import java.lang.reflect.Method; import java.util.Arrays; @MyAnnotation(color = "blue") public class AnnotationUse { @MyAnnotation(color = "red") public void use() { } public static void main(String []args) { MyAnnotation annotation = (MyAnnotation)AnnotationUse.class.getAnnotation(MyAnnotation.class); System.out.println(annotation.value()); System.out.println(annotation.color()); System.out.println(Arrays.toString(annotation.array())); Method []method = AnnotationUse.class.getDeclaredMethods(); for(Method m : method) { if(null != (annotation = (MyAnnotation)m.getAnnotation(MyAnnotation.class))) { System.out.println(annotation.color()); } } } }