Java注解平时使用的较少,不过可以看到,很多三方库中大量的使用Java注解进行代码的解耦。这里总结下Java注解的用法,以后在代码中还是要多多使用,增加熟练度。
元注解(meta-annotation)
注解的注解,可以用来注解普通注解,常用于自定义注解
@Target
这个元注解用于声明注解的适用范围,使用方法为@Target(ElementType.TYPE)
type共有七种:
- ElemenetType.CONSTRUCTOR 构造器声明
- ElemenetType.FIELD 域声明(包括 enum 实例)
- ElemenetType.LOCAL_VARIABLE 局部变量声明
- ElemenetType.METHOD 方法声明
- ElemenetType.PACKAGE 包声明
- ElemenetType.PARAMETER 参数声明
- ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
@Retention
这个注解用来描述注解保留的时间,使用方法为@Retention(RetentionPolicy.RUNTIME)
- SOURCE: Annotation只保留在原代码中,当编译器编译的时候就会抛弃它。(即源文件保留)
- CLASS: 编译器将把Annotation记录在Class文件中,不过当java程序执行的时候,JVM将抛弃它。(即class保留)
- RUNTIME: 在Retationpolicy.CLASS的基础上,JVM执行的时候也不会抛弃它,所以我们一般在程序中可以通过反射来获得这个注解,然后进行处理。
@Document
Document标记这个注解应该被javadoc工具记录。默认情况下,Javadoc是不包括注解的。
@Inherited
Inherited译为可继承的,如果一个使用了@Inherited 修饰的 annotation类型 被用于一个 class,则这个 annotation 将被用于该class的子类。
自定义注解
注解不能继承或者实现其它注解或者接口.
@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法名称为参数名称,返回值类型就是参数类型.可使用default指定参数的默认值.
注解可以定义多个方法,传入多个参数时可以这样,例如:
@Field(value = “tags”,encoded = false)
@Retention(SOURCE)
源码注解(RetentionPolicy.SOURCE)的生命周期只存在Java源文件这一阶段,是3种生命周期中最短的注解。基本无需刻意去做处理,如@InDef、@StringDef等
@Retention(Class)
使用APT去处理注解
@Retention(RunTime)
生命周期最长通常可以使用反射,也可以使用自定义注解器