注释(Annotation)
Posted lotz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注释(Annotation)相关的知识,希望对你有一定的参考价值。
注释可以在编译、类加载、运行时被读取,并执行相应的处理。Annotation可以像修饰符一样使用,可以修饰包、类、构造器、方法、成员变量;、参数、局部变量。访问和处理Annotation的工具成为APT。
1)基本Annotation
@Override @Deprecated @SuppressWarnings
① 限定重写父类方法:@Override
用来指定方法重写,可以强制子类覆盖父类的方法。程序编译时会告诉编译器检查这个方法,如果没有被重写,则会编译出错。
② 标示已过时:@Deprecated
用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器将会给出警告 。
③ 抑制编译器警告:@SuppressWarnings
指示被Annotation标识的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告。
2)自定义Annotation
定义新的Annotation类型使用@interface关键字,如:
//定义一个简单的Annotation类型
public @interface Test
之后便可以在程序的任何地方来使用该Annotation,通常可用于修饰程序中的类、方法、变量、接口等。
Annotation可以带成员变量,成员变量在Annotation定义中以无参数方法的形式来声明,其方法名和返回值定义了该成员变量的名字和类型,如:
public @interface Test //定义两个成员变量的Annotation //Annotation中的成员变量以方法的形式来定义 String name(); int age();
可以看出,Annotation和接口定义非常相像。如果Annotation里定义了成员变量之后,使用该Annotation时应该为成员变量指定值。可以在定义Annotation的成员变量时指定初始值,利用default关键字,如:
public @interface Test //定义两个成员变量的Annotation //Annotation中的成员变量以default指定初始值 String name() default "xx"; int age() default 32;
指定默认值后,便可以直接使用默认值,无须指定成员变量的值。如果定义的Annotation类型里只有一个value成员变量时,可以直接在Annotation后的括号里指定value成员变量的值,无须使用name=value形式。
利用Annotation可以借助反射工具,实现相应的绑定、测试等功能。
3)JDK的元Annotation
① @Retention
用于指定该Annotation可以保留多长时间,可取值有:
RetentionPolicy.CLASS:编译器将把注释记录在class文件中,当运行java程序时,JVM不再保留注释,这是默认值。
RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中,当运行java程序时,JVM保留注释,程序可以通过反编译获取该注释。
RetentionPolicy.SOURCE:编译器直接丢掉这种策略的注释。
② @Target
用于指定Annotation能用于修饰哪些程序元素,其值有:
ElementType.ANNOTATION_TYPE:只能修饰Annotation
ElementType.CONSTRUCTOR:修饰构造器
ElementType.FIELD:修饰成员变量
ElementType.LOCAL_VARIABLE:只能修饰局部变量
ElementType.METHOD:只能修饰方法
ElementType.PACKAGE:只能修饰包
ElementType.PARAMETER:修饰参数
ElementType.TYPE:可以修饰类、接口(包括注释类型)、枚举。
③ @Documented
表示Annotation类将被javadoc工具提取成文档
④ @Inherited
表示Annotation具有继承性:如果某个类使用了A Annotation(使用@Inherited修饰)修饰,则其子类将自动具有A注释。
4)应用
android ButterKnife
项目编译时对源代码进行扫描检测找出存活时间为RetentionPolicy.CLASS的指定注解,然后对注解进行解析处理,进而得到要生成的类的必要信息,然后根据这些信息动态生成对应的 java 类,由于它是在编译时对注解进行解析完成相关代码的生成,所以在项目编译时会略耗时,但不会影响运行时的性能。
以上是关于注释(Annotation)的主要内容,如果未能解决你的问题,请参考以下文章