zoukankan      html  css  js  c++  java
  • @Retention元注解的使用

    @Retention注解标记其他的注解用于指明标记的注解保留策略:
    先看Java SE 8中@Target是如何声明的:

    package java.lang.annotation;
    
    public enum RetentionPolicy {
        /**
         * Annotations are to be discarded by the compiler.
         */
        SOURCE,
    
        /**
         * Annotations are to be recorded in the class file by the compiler
         * but need not be retained by the VM at run time.  This is the default
         * behavior.
         */
        CLASS,
    
        /**
         * Annotations are to be recorded in the class file by the compiler and
         * retained by the VM at run time, so they may be read reflectively.
         *
         * @see java.lang.reflect.AnnotatedElement
         */
        RUNTIME
    }

    从源代码的注释中,我们看到java.lang.annotation.RetentionPolicy此枚举类声明了三种保留策略:

    java.lang.annotation.RetentionPolicy.SOURCE:表示注解会在编译时被丢弃
    java.lang.annotation.RetentionPolicy.CLASS:默认策略,表示注解会在编译后的class文件中存在,但是在运行时,不会被VM保留。
    java.lang.annotation.RetentionPolicy.RUNTIME:表示不仅会在编译后的class文件中存在,而且在运行时保留,因此它们主要用于反射场景,可以通过getAnnotation方法获取。

    这三种保留策略的使用示例:

     声明@Country注解,采用的是RUNTIME策略:

    package org.springmorning.demo.javabase.annotation.meta;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @author 春晨
     * @date 2019/1/14 19:30
     * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html 
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Country {
        //国家名称
        String name();
        //国家语言
        String[] languages();
    }

    声明@Region注解,采用的是CLASS策略(默认策略):

    package org.springmorning.demo.javabase.annotation.meta;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @author 春晨
     * @date 2019/1/14 19:37
     * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.CLASS)
    public @interface Region {
        //地区名称
        String name();
        //所属国家
        String country();
    }

    声明@Home注解,采用的是SOURCE策略:

    package org.springmorning.demo.javabase.annotation.meta;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @author 春晨
     * @date 2019/1/14 19:43
     * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Home {
        //成员
        String[] members();
        //地址
        String address();
    }

    编写测试类:

    package org.springmorning.demo.javabase.annotation.meta;
    
    import java.lang.annotation.Annotation;
    
    /**
     * @author 春晨
     * @date 2019/1/14 19:34
     * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html
     */
    @Country(
            name = "China",
            languages = {"Chinese"}
    )
    @Region(
            name = "GuangDong",
            country = "China"
    )
    @Home(
            members = {"Wolffy","Wolnie","Wilie"},
            address = "Qingqing grasslands"
    )
    public class RetentionAnnotation {
    
        public static void main(String[] args) {
            Annotation[] annotations = RetentionAnnotation.class.getAnnotations();
            System.out.println("获取能保留到运行时的注解:");
            for (Annotation annotation :annotations){
                System.out.println(annotation.toString());
            }
        }
    }

    运行结果:

    获取能保留到运行时的注解:
    @org.springmorning.demo.javabase.annotation.meta.Country(name=China, languages=[Chinese])

    采用javap命令分析RetentionAnnotation的class文件如下图:

    下节继续

        下节将给大家讲解元注解@Document的使用。

         

  • 相关阅读:
    盛最多水容器
    罗马数字和整数互相转化
    v-if和v-for
    扫描二维码登录
    使用Promise实现红绿灯交替重复亮
    利用promise实现间隔1s打印1,2,3
    原生js拖拽
    react项目引入使用element-react报错
    php实现类似淘宝最近浏览商品的功能模型代码
    教你如何把php项目打包成EXE文件发布
  • 原文地址:https://www.cnblogs.com/springmorning/p/10265030.html
Copyright © 2011-2022 走看看