Annotation 定义语法
@Documented
@Inherited
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface AnnotationXxx {
//注解成员变量
}
解释说明:
AnnotationXxx 所定义的Annotation的名字,通过@AnnotationXxx使用。
1、@interface
定义 Annotation 时,@interface 是必须的。表示它实现了 java.lang.annotation.Annotation 接口,并且不能继承其他的注解或接口。区别于 implemented ,Annotation 接口的实现由编译器完成。
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class extends Annotation> annotationType();
}
2、@Documented
使用 @Documented 修饰 Annotation,表示它可以出现在 javadoc 中,若未定义则不出现。
3、@Inherited
表示继承。用此修饰的注解用于一个父类,如果子类没有其他的注解修饰,则子类继承父类的此注解。
4、@Target({ElementType.METHOD})
用来指定 Annotation 的使用范围。可以为一个Annotation指定1个或多个ElementType;注解只能在指定的范围内使用。
package java.lang.annotation;
public enum ElementType {
TYPE, //类、接口
FIELD, //字段、枚举常量
METHOD, //方法
PARAMETER, //参数声明
CONSTRUCTOR, 构造方法
LOCAL_VARIABLE,//局部变量
ANNOTATION_TYPE,//注释
PACKAGE, //包
TYPE_PARAMETER, //类型参数
TYPE_USE; //能标注任何类型名称
}
5、@Retention(RetentionPolicy.SOURCE)
用来指定 Annotation 的保留位置。可以为一个Annotation指定一个RetentionPolicy。若没有 @Retention,则默认是 RetentionPolicy.CLASS。
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE,//存在于编译器处理期间
CLASS,//存储于类对应的.class文件中
RUNTIME; //存储于class文件中,并且可由JVM读入
}
6、注解成员变量
@Documented
@Inherited
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface AnnotationXxx {
//注解成员变量
String value();
String argNames() default "";
}
注解继承自Annotation接口,接口中包括属性和方法。其中属性是static final修饰的,对注解没有意义;其中的方法就是注解的属性。
注解属性类型
基本数据类型、String、枚举、注解、Class、数组等。
注解成员变量赋值
@Documented
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationInterface {
String value();
String argNames() default "";
}
@AnnotationInterface(value = "value1",argNames = "name1")
public class AnnotationClass {
}
如果有多个注解变量,赋值用逗号区别开,分别赋值。
获取注解的值
Class
boolean isAnnotationPresent = annotationClass.isAnnotationPresent(AnnotationInterface.class);//注解是否存在
if(isAnnotationPresent){
AnnotationInterface annotationInterface = annotationClass.getAnnotation(AnnotationInterface.class);//获取注解实例
String value = annotationInterface.value();
String argNames = annotationInterface.argNames();
System.out.println("value : " + value + "\n" + "argNames : " + argNames);
}