`
ljhupahu
  • 浏览: 33767 次
  • 性别: 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

分享到:
评论

相关推荐

    annotation

    在这个例子中,`@Retention(RetentionPolicy.RUNTIME)`表明`CustomAnnotation`将在运行时保留,因此我们可以在`main`方法中通过反射获取到该注解的信息。 最后,`Demo.java`可能包含使用上述注解的实际业务逻辑。...

    Annotation详细介绍(大全)

    例如,`@Retention(RetentionPolicy.RUNTIME)`的Annotation可以通过`java.lang.reflect.AnnotatedElement`的API在运行时获取。 10. **自定义Annotation处理器**: Java提供`javax.annotation.processing.Processor...

    Java Annotation注解.doc

    保留策略通过`@Retention`注解指定,例如`RetentionPolicy.RUNTIME`表示注解在运行时可用,`RetentionPolicy.CLASS`表示仅在类文件中保留,`RetentionPolicy.SOURCE`则表示只存在于源代码中。 5. **元注解**:元...

    JDK5.0 Java Annotation 介绍(ppt)

    例如,`@Override` 只在编译时检查,而 `@Retention(RetentionPolicy.RUNTIME)` 注解的 Annotation 可以在运行时通过反射获取。 五、Annotation 的作用 1. **编译时验证**:Annotation 可用于编译时检查,确保代码...

    什么是Annotation?

    ### 什么是Annotation? #### 一、Annotation的概念 在Java 1.5版本中引入了一个重要的新特性——**Annotation**(注解)。Annotation本质上是一种元数据(即关于数据的数据),它提供了一种机制来关联程序元素...

    Annotation注解的介绍和使用

    @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation {} ``` ##### 4.4 `@Documented`:在帮助文档中加入注释 `@Documented`元注解表示该注解应该被包括在JavaDoc文档中。 ```java @Documented ...

    Spring MVC Annotation验证的方法

    @Retention(RetentionPolicy.RUNTIME) public @interface Tel { String message() default "电话号码格式不正确"; Class[] groups() default {}; Class[] payload() default {}; } ``` 四、使用自定义的 ...

    Annotation--学习:JDK内建Annotation

    @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` 这里定义了一个名为`MyAnnotation`的注解,`Retention`指定其生命...

    annotation详解

    @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` 这个例子定义了一个名为`MyAnnotation`的注解,它将在运行时可用,并且...

    Java 5 annotation 学习笔记

    在定义注解时,通过`@Retention(RetentionPolicy.CLASS / SOURCE / RUNTIME)`指定。 6. 获取注解: 反射机制是获取注解的主要方式,通过`AnnotatedElement`接口的实现类(如`Class`, `Method`, `Field`等)的`...

    Java Annotation的讲解和例子

    Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...

    2个案例 自定义annotation进行查询对象封装 itext 打印案例

    import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface QueryObject { String name() default ...

    Java实战篇:设计自己的Annotation

    import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 定义自定义Annotation @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TestMethod {...

    Java自定义注解Annotation的使用

    ### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...

    annotation.zip

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不必修改代码的行为。自定义注解允许开发人员创建自己的注解类型,以满足特定项目或框架的需求。在这个名为...

    安卓Annotation实例

    @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` - `@Retention`定义了注解的存活期,`@Target`指定注解可以应用到的...

Global site tag (gtag.js) - Google Analytics