注解

定义

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
通俗的说就是一个标签,使用这个标签来对要标记的对象做说明,主要是与Java中的反射想结合来使用。

public @interface Name {
    String value() default "";
}

元注解

注释注解的注解
包括 @Target @Retention @Document @Inherited四种。

@Target 定义注解的作用目标

@Target(ElementType.TYPE)  //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR)  //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包   

@Retention 说明该注解保持的时间

@Retention(RetentionPolicy.SOURCE) //注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
@Retention(RetentionPolicy.CLASS) //注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
@Retention(RetentionPolicy.RUNTIME) //注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

由于一般注解都会配合着反射来使用,故一般将其设置为 RUNTIME
@Document 说明该注解将被包含在javadoc中
@Inherited 说明子类可以继承父类中的该注解

举例说明:

//定义一个@Name注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Name {
    String value() default "";
}
//定义一个Person类,并使用@Name注解
public class Person {
    @Name("卡卡罗特")
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
    //测试
    @Test
    public void testAnnotation(){
        try {
            Name name = Person.class.getDeclaredField("name").getAnnotation(Name.class);
            System.out.println(name.value());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
posted @ 2019-05-20 10:18  pallcard  阅读(85)  评论(0编辑  收藏  举报