zoukankan      html  css  js  c++  java
  • 元注解

    元注解的概念

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

    元注解主要有  @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 {
    }
  • 相关阅读:
    HttpInvoker-----服务端实现
    RMI实现-----客户端的实现
    RMI实现-----服务端的实现
    远程服务(RMI)使用示例
    DispatcherServlet的逻辑处理(下篇)
    DispatcherServlet的逻辑处理(上篇)
    SpringMVC-----DispatcherServlet
    SpringMVC-----ContextLoaderListener
    爬取淘宝笔记本电脑数据(一)
    哔哩哔哩自动播放视频
  • 原文地址:https://www.cnblogs.com/xujiaqi/p/13659012.html
Copyright © 2011-2022 走看看