一、了解注释
注释是java1.5 jdk这后引入的特性。Java库自己带的注释有@Deprecated, @Overwrite等。
注释是加在类,方法,变量等上的一种标记。并且,可以通过javaj反射操作把这个标记取出来。主要用途是用于对方法,变量,类等作统一标记,然后根据标记对其进行统一处理。
注释的使用流程:
二. 注释的定义及使用
定义有参数和无参数的annotation, annotation是一个单独的类,声明方式与interface的声明方式相似。
//没有参数的annotation定义
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotationNoValue { }
//有参数的annotation定义
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotationMultiValue {String hello() default "I'm the default value";int number() default 0;int [] arrays() default {1,2,3}; }
//annotation测试代码
public class AnnotationTest {@MyAnnotationNoValuepublic void annotationNoValue(){}@MyAnnotationSingleValue("the single value")public void annotationSingleValue(){}@MyAnnotationMultiValue(hello="I'm joy, hello", number = 123, arrays = {6,6,6})public void annotationMultiValue(){}public static void main(String args[]) throws Exception{AnnotationTest test = new AnnotationTest();Method method = AnnotationTest.class.getMethod("annotationNoValue", null);if(method.isAnnotationPresent(MyAnnotationNoValue.class)){System.out.println("no value annotation" + method.getAnnotation(MyAnnotationNoValue.class));}method = AnnotationTest.class.getMethod("annotationSingleValue", null);if(method.isAnnotationPresent(MyAnnotationSingleValue.class)){System.out.println("one value annotation" + method.getAnnotation(MyAnnotationSingleValue.class).value());}method = AnnotationTest.class.getMethod("annotationMultiValue", null);if(method.isAnnotationPresent(MyAnnotationMultiValue.class)){System.out.println("one value annotation" + method.getAnnotation(MyAnnotationMultiValue.class).hello());System.out.println("one value annotation" + method.getAnnotation(MyAnnotationMultiValue.class).number());System.out.println("one value annotation" + method.getAnnotation(MyAnnotationMultiValue.class).arrays().toString());}} }
三、四种元注释
1.@Documented----指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。
如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API。
2.@Target----指明该类型的注解可以注解的程序元素的范围。该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注
解没有出现,那么定义的注解可以应用于程序的任何元素。
3.@Inherited----指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查
询当前类的父类是否存在Inherited元注解,这个动作将被重复执行直到这个标注类型被找到,或者是查询到顶层的父类。
4.@Retention----指明了该注解被保留的时间长短。RetentionPolicy取值为SOURCE、CLASS、RUNTIME。
Retention说明
指定annotation的生命周期。Java编译时从源代码-> class文件->内存字节码。这三个阶段对应三种存在周期。
RetentionPolicy.SOURCE:只在源文件中存在。编译成class文件时清除。
RetentionPolicy.CLASS:只在class文件中存在。加载为内存字节码时清除。
RetentionPolicy.RUNTIME:一直存在。
默认值为:RetentionPolicy.CLASS
Target说明
指定annotation的使用范围。
默认值为所有。
可指定class, method等。
参数变量
可以为annotation添加变量,这些变量将作为标记时的参数。数组类型使用{}来标记。如果只有一个参数,则不用写参数名。
三、注释的编译流程
关于annotation在selenium中的应用。
https://zhuanlan.zhihu.com/p/39545755
annotation参考文档:
https://www.cnblogs.com/xdp-gacl/p/3622275.html