一、说明
Java中的注解自1.5版本开始引入
Java提供了@Target、@Retention、@Documented、@Inherited4种元注解用于自定义注解的创建
二、一个简单的例子
Table.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface Table {
public String tableName();
public String primaryKey() default "id";
}
@Table(tableName="user")
public class TestEntity {
}
public class Test {
public static void main(String[] args) {
Table aTable = TestEntity.class.getAnnotation(Table.class);
if(aTable != null){
System.out.println(aTable.tableName());
System.out.println(aTable.primaryKey());
} else {
System.out.println("no annotation");
}
}
}
三、@Target注解
表示注解可以使用在哪些位置
其参数为枚举类型的ElementType或该类型的数组
ElementType的参数主要有:
CONSTRUCTOR,表示注解可用于构造器的声明
FIELD,表示注解可用于域声明
LOCAL_VARIABLE,表示注解可用于声明局部变量时
METHOD,表示注解可用于声明方法时
PACKAGE,表示注解可用于声明包时
PARAMETER,表示注解可用于声明参数时
TYPE,表示注解可用于声明类型时(包括类、接口、注解、Enum)
四、@Retention注解
表示注解可以被保存至哪个级别
其参数为枚举类型的RetentionPolicy
RetentionPolicy的参数主要有:
SOURCE,表示注解在编译时即被丢弃
CLASS,表示注解会保留在class文件中,但是会被Java虚拟机丢弃
RUNTIME,表示注解在Java虚拟机运行期间仍然保留(可以在程序中通过反射机制获取注解的信息)
五、@Documented注解
如果自定义注解增加该项元注解,则自定义注解会包含Javadoc中
六、@Inherited注解
如果自定义注解增加该项元注解,则允许子类继承父类中的自定义注解
七、注解的属性
注解只有成员变量,且成员变量以一种“没有形参的方法”的形式来进行定义
成员变量仅可以使用public、abstract修饰符进行修饰(或无修饰符,即friendly)
成员变量可以使用default关键字指定默认值,如果未指定默认值,则在使用时需指定属性值
如果只有一个名为value的成员变量,则使用自定义注解时可以直接将属性值写入注解后的括号内
Table.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface Table {
public String tableName();//未指定默认值的属性
public String primaryKey() default "id";//指定默认值的属性
int defaultValue default -1;
}
TestEntity.java
@Table(tableName = "system_user",primaryKey = "tableId")//指定属性值时,采用“属性=值”的形式,多个属性使用英文逗号隔开
public Class TestEntity(){
}
Table.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface Table {
public String value();//仅指定value变量,则可以将属性值直接写入注解后的括号内
}
TestEntity.java
@Table("system_user")
public Class TestEntity(){
}