定义注解
格式:@interface AnnotationName
在定义注解时,会用到一些元注解(meta-annotation),如@Target和@Retention。@Target用来指明该注解的应用范围,@Retention用来指明该注解的应用级别。
如下
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface Annotation { }
注解Annotation的应用范围是METHOD;应用级别是RUNTIME,表示该注解能被虚拟机保存在class文件中。
注解内部可以包含一些元素以表示某些值,当该注解没有元素时被称为标识性注解(marker annotation),如上面的@Annotation。
Java内置了三种标准注解以及四种元注解。
标准注解
@Override:表示当前的方法要覆盖父类中的方法。若该方法的签名和父类的方法不一致就会报错。
@Deprecated:表示不建议被使用的。若使用了注解为它的元素,编译器会提出警告信息。
@SuppressWarnings:关闭不必要的编译器警告。
元注解
@Target | 表示注解的应用范围,可取值为ElementType枚举值的某一个。 CONSTRUCTOR:应用于构造器 FIELD:应用于字段 LOCAL_VARABLE:应用于局部变量 METHOD:应用于方法 PACKAGE:应用于包 PARAMETER:应用月参数声明 TYPE:应用于类、接口、注解和enum |
@Retention | 表示注解的应用级别,可取的值为RetentionPolicy枚举值的某一个。 SOURCE:注解被编译器忽略,不保存在class文件中 CLASS:默认的级别,注解被编译器保存在class文件中,但被JVM忽略 RUNTIME:注解被编译器保存在class文件中,能被JVM读取,可以通过反射来读取该注解的信息 |
@Documented | 将此注解包含在javadoc中 |
@Inherited | 注解默认不能被继承,此注解能使注解被继承 |
注解元素可用的类型为
- 所有基本类型(int、float、double等)
- Class
- String
- enum
- Annotation
- 以上类型的数组
如果使用了除以上类型以外的其他类型,编译器会报错。基本类型的包装类型Integer、Float、Double等也不能是注解的类型。
示例:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface Annotation { String element() default "default value";//元素类型为String,元素名为element,默认值是default value }
注解的使用
class AnnotationTest { @Annotation(element = "annotation test")//此注解只能应用于方法 public void method() { } }当注解的元素名为value时,并且只使用该元素,使用的时候可以省略value,直接写该元素的值。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface Annotation { String value() default "default value"; } class AnnotationTest { @Annotation("annotation test") public void method() { } }
注解的应用
注解在一些测试框架中常用到,使用注解测试框架的时候,要理解注解测试框架的流程。这里会用到java.lang.reflect.AnnotatedElement 接口中的方法。
getAnnotation(Class cl);获得摸个指定的注解
getAnnotations();获得该类的所有注解
getDeclaredAnnotation();获得该类声明的所有注解
isAnnotationPresent(Class cl);判断是否存在指定的注解
某个使用了注解的类中
Method[] methods = AnnotationTest.class.getMethods(); for (Method method : methods) { if (method.isAnnotationPresent(Annotation.class)) { //在测试框架中,可以在判断有某个注解后执行一些必要的代码 System.out.println(method.getName() + " " + "have annotation"); } }