annotation的作用是不用多说的,大家有目共睹。那么我就开始介绍其使用方式。
当前,我们先来熟悉下java的元注解。
元注解:负责注解自定义的注解的注解。java5.0定义了4个标准的元注解
@Target
@Retention
@documented
@Inherited
下面我们挨个详细介绍
@Target
@Target说明了Annotation所修饰的对象的范围:Annotation可被用于packages,types(类,接口,枚举,Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
作用:用于描述注解的使用范围。
取值(ElementType):
CONSTRUCTOR:描述构造器
FIELD:域
LOCAL_VARIABLE:局部变量
METHOD:方法
PACKAGE:包
PARAMETER:参数
TYPE:类、接口、enum
使用实例:
@Target(ElementType.TYPE)
public @interface Table {
//数据表名称注解,默认值是类的名称
//@return
public String tableName() default "className";
}
@Target(ElementType.FIELD)
public @interface NoDBColumn {
//数据列的名称注解,默认值是属性名称
//@return
public String columnName() default "fieldName";
}
注解Table可以用于注解类、接口(包括注解类型)或者enum声明,而注解NoDBcolumn仅可用于注解类的成员变量。
@Retention:
@Retention 定义了该Annotation 被保留的时间长短:
1. 仅出现在源码中,被编译器丢弃,即在编译时就丢弃了。
2. 可以编译到class文件中,编译到class文件中的, 一种是被虚拟机忽略;一种是在装载时读取。(Annotation与class在使用时是被分离的,互不影响)。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期.
取值(RetentionPolicy):
SOURCE:在源文件中有效
CLASS:在 class 文件中有效
RUNTIME:在运行时有效
Retention 类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy 的枚举类型。
具体实例:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String name() defualt "fieldName";
public String setFuncName() defualt "setField";
public String getFuncName() defualt "getField";
public boolean defualtDBValue() defualt false;
}
Column注解的RetentionPolicy属性值是RUNTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做运行时的逻辑处理。
@Documented是一个标记注解,没有成员。