`
ljhupahu
  • 浏览: 32602 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Annotation RetentionPolicy 区别

阅读更多

RetentionPolicy做为一个enum类, 有三个值。

  1. RetentionPolicy.SOURCE:  其生命周期只存在于source code这个阶段, 在compile的时候, 这类annotation会被JVM所丢弃。当编译完成后, 这类annotation是没有用处的。如: @Override@SuppressWarnings
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
  2. RetentionPolicy.CLASS: RetentionPolicy默认为 CLASS, 当class被加载时, 此类annotation被丢弃。(感觉很少有使用CLASS的情况)
  3. RetentionPolicy.RUNTIME: 存在于整个JVM运行环境中。 如:@Deprecated
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    public @interface Deprecated {
    }
    
     

Code Example:

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

/**
 * 
 */
public class RetentionPolicyDemo {

    @Retention(RetentionPolicy.SOURCE)
    @interface RetentionSource {}

    @Retention(RetentionPolicy.CLASS)
    @interface RetentionClass {}

    @Retention(RetentionPolicy.RUNTIME)
    @interface RetentionRuntime {}

    public static void main(String[] args) {
        @RetentionSource
class B {}
        System.out.println(B.class.getAnnotations().length ); // Result: 0
@RetentionClass
class C {}
        System.out.println(C.class.getAnnotations().length ); // Result: 0
@RetentionRuntime
class D {}
        System.out.println(D.class.getAnnotations().length ); // Result: 1
}
}

 只有RetentionPolicy.RUNTIME 返回大于0的length.

 

字节码demo: 

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface Anno {
}

 

@Anno
public class AnnoTest {
    @Deprecated
    public void test() {
    }
}

 

Constant pool:

   #1 = Methodref          #3.#19         // java/lang/Object."<init>":()V

   #2 = Class              #20            // com/my/java/lang/annotation/retentio

   #3 = Class              #21            // java/lang/Object

   #4 = Utf8               <init>

   #5 = Utf8               ()V

   #6 = Utf8               Code

   #7 = Utf8               LineNumberTable

   #8 = Utf8               LocalVariableTable

   #9 = Utf8               this

  #10 = Utf8               Lcom/my/java/lang/annotation/retentionPolicy/AnnoTest;

  #11 = Utf8               test

  #12 = Utf8               Deprecated

  #13 = Utf8               RuntimeVisibleAnnotations

  #14 = Utf8               Ljava/lang/Deprecated;

  #15 = Utf8               SourceFile

  #16 = Utf8               AnnoTest.java

  #17 = Utf8               RuntimeInvisibleAnnotations

  #18 = Utf8               Lcom/my/java/lang/annotation/retentionPolicy/Anno;

  #19 = NameAndType        #4:#5          // "<init>":()V

  #20 = Utf8               com/my/java/lang/annotation/retentionPolicy/AnnoTest

 

从红色字体中可以看出RetentionPolicy.RUNTIME为RuntimeVisibleAnnotations。  

RetentionPolicy.CLASS为RuntimeInvisibleAnnotations

分享到:
评论

相关推荐

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    jakarta.annotation-api-1.3.5-API文档-中英对照版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.3.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.3.2.jar; 赠送原API文档:javax.annotation-api-1.3.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.3.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-...

    annotation-1.1.0.jar

    @androidx.annotation.NonNull 缺失的兼容、androidx.annotation兼容包

    annotation的jar包

    javax.annotation-3.0.jar javax.annotation-3.0.jar javax.annotation-3.0.jar

    geronimo-annotation_1.0_spec-1.1.1-API文档-中文版.zip

    赠送jar包:geronimo-annotation_1.0_spec-1.1.1.jar; 赠送原API文档:geronimo-annotation_1.0_spec-1.1.1-javadoc.jar; 赠送源代码:geronimo-annotation_1.0_spec-1.1.1-sources.jar; 赠送Maven依赖信息文件:...

    JAVA 标注annotation

    Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...

    spring 的Annotation方式

    Spring Annotation

    Hibernate Annotation jar

    这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...

    javax.annotation-api-1.3.2

    JDK9及以上版本没有javax.annotation-api-***.jar包 ,无法使用注解:@Resource JDK新特性,高版本JDK没有自带的javax(java扩展包)了。或者是使用的JDK不完整。 下载javax.annotation.jar包,导入到lib文件夹下,...

    androidx-annotation-1.0.0.jar

    androidx-annotation-1.0.0.jar

    Java Annotation详解

    Java Annotation详解 Java Annotation详解 Java Annotation详解

    Annotation详细介绍(大全)

    Annotation权威资料 Annotation权威资料 Annotation权威资料 Annotation权威资料 Annotation权威资料 Annotation权威资料Annotation权威资料

    hibernate annotation hibernate3

    hibernate annotation hibernate3

    hibernate annotation中文文档

    hibernate annotation中文文档

    Annotation技术

    Annotation核心技术Annotation核心技术Annotation核心技术Annotation核心技术Annotation核心技术Annotation核心技术

    Java 5 annotation 学习笔记

    Java 5 annotation 学习笔记Java 5 annotation 学习笔记Java 5 annotation 学习笔记

    hibernate 注解 annotation 教程

    hibernate 注解 annotation 教程

    mybatis-plus-annotation-3.2.0-API文档-中英对照版.zip

    赠送jar包:mybatis-plus-annotation-3.2.0.jar; 赠送原API文档:mybatis-plus-annotation-3.2.0-javadoc.jar; 赠送源代码:mybatis-plus-annotation-3.2.0-sources.jar; 赠送Maven依赖信息文件:mybatis-plus-...

Global site tag (gtag.js) - Google Analytics