元注解

元注解的概念

  元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其他的注解上面。

元注解主要有  @Retention、@Documented、@Target、@Inherited、@Repeatable。

元注解@Retention

  @Retention应用到一个注解上用于说明该注解的生命周期,取值如下:

    1、RetentionPolicy.SOURCE  注解只在源码阶段保留,在编译阶段进行编译时它将被丢弃忽视。

    2、RetentionPolicy.CLASS   注解只被保留到编译进行的时候,它并不会被加载到JVM中,“默认方式”。

    3、RetentionPolicy.RUNTIME  注解可以保留到程序运行的时候,它会被加载进入到JVM中,所以在程序运行时可以获取到它们。

package com.lagou.task10;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//  @Retention(RetentionPolicy.SOURCE)  //  表示下面注解在源代码中有效
//  @Retention(RetentionPolicy.CLASS)   //  表示下面的注解在字节码文件中有效,默认方式
  @Retention(RetentionPolicy.RUNTIME) //  表示下面的注解在运行时有效
public @interface MyAnnotation {
    public String value() default "默认值";
}

 元注解@Documented

  使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个源代码配套的API帮助文档,而该工具抽取时默认不包括注释内容。

  @Documented用于指定被该注解将被javadoc工具提取文档。

  定义为@Documented的注解必须设置Retention值为RUNTIME。

package com.lagou.task10;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

  @Retention(RetentionPolicy.RUNTIME) //  表示下面的注解在运行时有效
  @Documented               // 表示下面的注解信息可以被javadoc工具提取到API文档中
//  若一个注解中没有任何的成员,则这样的注解叫做标记注解/标识注解
public @interface MyAnnotation {
    //  public Direction value1();  //注解类型不允许使用Direction
    public String value() default "默认值";  //声明一个string类型的成员变量,名字为value
    public String value1() default "默认值";
}

元注解@Target

  @Target用于指定被修饰的注解能用于哪些元素的修饰,取值如下:

 从java8开始对元注解@Taget的参数类型ElementType枚举值增加了两个:

  其中ElementType.Type_PARAMETER  表示该注解能写在类型变量的声明语句中,如:泛型。

  其中ElementType.TYPE_USE       表示该注解能写在使用类型的任何语句中。

package com.lagou.task10;

import java.lang.annotation.*;

//  @Retention(RetentionPolicy.SOURCE)  //  表示下面注解在源代码中有效
//  @Retention(RetentionPolicy.CLASS)   //  表示下面的注解在字节码文件中有效,默认方式
  @Retention(RetentionPolicy.RUNTIME)   //  表示下面的注解在运行时有效
  @Documented                           // 表示下面的注解信息可以被javadoc工具提取到API文档中
  //  表示下面的注解可以用于类型、构造方法、成员变量、成员方法、方法内的形参的修饰
  @Target({ElementType.TYPE,ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
//  若一个注解中没有任何的成员,则这样的注解叫做标记注解/标识注解
public @interface MyAnnotation {
    //  public Direction value1();  //注解类型不允许使用Direction
    public String value() default "默认值";  //声明一个string类型的成员变量,名字为value
    public String value1() default "默认值";
}

所谓的注解就是标签,哪里需要标签往哪里贴就可以了。

  Tatget的功能很清晰,标注什么地方能用注解,但是没有标注的地方用了就会报错。

元注解@Inherited

  @Inherited并不是说注解本身可以继承,而是说如果一个超类被该注解标记过的注解进行注释时,如果子类没有被任何注解应用时,则子类就继承超类的注解。

  就是说@Inherited修饰的注解在父类中使用,假设子类没有使用任何注解将继承父类的注解(继承@Inherited修饰的注解)

package com.lagou.task10;

        import java.lang.annotation.*;

//  @Retention(RetentionPolicy.SOURCE)  //  表示下面注解在源代码中有效
//  @Retention(RetentionPolicy.CLASS)   //  表示下面的注解在字节码文件中有效,默认方式
@Retention(RetentionPolicy.RUNTIME)   //  表示下面的注解在运行时有效
@Documented                           // 表示下面的注解信息可以被javadoc工具提取到API文档中
//  表示下面的注解可以用于类型、构造方法、成员变量、成员方法、方法内的形参的修饰
@Target({ElementType.TYPE,ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
@Inherited  //  表示下面的注解所修饰的类中的注解使用可以被子类继承
//  若一个注解中没有任何的成员,则这样的注解叫做标记注解/标识注解
public @interface MyAnnotation {
    //  public Direction value1();  //注解类型不允许使用Direction
    public String value() default "默认值";  //声明一个string类型的成员变量,名字为value
    public String value1() default "默认值";
}

元注解@Repeatble

  @Repeatble表示自然可重复的含义,从java8开始增加的新特性。

假设要重复使用同一个注解,在java8以前是这样做的

利用数组的形式,把相同的注解放在一维数组中

package com.lagou.task10;

/**
 * 自定义注解用于描述多种角色
 */
public @interface ManTypes {
    ManType[] value();
}
package com.lagou.task10;

@ManTypes({@ManType(value = "职工"),@ManType(value = "超人")})
public class Man {
}

使用@Repeatble重写

  使用@Repeatbla可以直接重复使用@ManType注解,不需要放在一维数组中,@Repeatble注解的value值需要填入class,这个注解本来是不能实现多次描述的它是依赖于@ManTypes这个注解,拿过来.class就可以了。

package com.lagou.task10;

import java.lang.annotation.Repeatable;

/**
 * 自定义注解用于描述任务的角色
 */
@Repeatable(value = ManTypes.class)
public @interface ManType {
    public String value() default "";
}
package com.lagou.task10;

@ManType(value = "职工")
@ManType(value = "超人")
public class Man {
}
原文地址:https://www.cnblogs.com/xujiaqi/p/13659012.html