Java 注解(Annotation)

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 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 annotationClass = 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);

}

你可能感兴趣的:(Java 注解(Annotation))