RetentionPolicy做为一个enum类, 有三个值。
- RetentionPolicy.SOURCE: 其生命周期只存在于source code这个阶段, 在compile的时候, 这类annotation会被JVM所丢弃。当编译完成后, 这类annotation是没有用处的。如:
@Override
,@SuppressWarnings
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
- RetentionPolicy.CLASS: RetentionPolicy默认为 CLASS, 当class被加载时, 此类annotation被丢弃。(感觉很少有使用CLASS的情况)
- 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
相关推荐
在这个例子中,`@Retention(RetentionPolicy.RUNTIME)`表明`CustomAnnotation`将在运行时保留,因此我们可以在`main`方法中通过反射获取到该注解的信息。 最后,`Demo.java`可能包含使用上述注解的实际业务逻辑。...
例如,`@Retention(RetentionPolicy.RUNTIME)`的Annotation可以通过`java.lang.reflect.AnnotatedElement`的API在运行时获取。 10. **自定义Annotation处理器**: Java提供`javax.annotation.processing.Processor...
保留策略通过`@Retention`注解指定,例如`RetentionPolicy.RUNTIME`表示注解在运行时可用,`RetentionPolicy.CLASS`表示仅在类文件中保留,`RetentionPolicy.SOURCE`则表示只存在于源代码中。 5. **元注解**:元...
例如,`@Override` 只在编译时检查,而 `@Retention(RetentionPolicy.RUNTIME)` 注解的 Annotation 可以在运行时通过反射获取。 五、Annotation 的作用 1. **编译时验证**:Annotation 可用于编译时检查,确保代码...
### 什么是Annotation? #### 一、Annotation的概念 在Java 1.5版本中引入了一个重要的新特性——**Annotation**(注解)。Annotation本质上是一种元数据(即关于数据的数据),它提供了一种机制来关联程序元素...
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation {} ``` ##### 4.4 `@Documented`:在帮助文档中加入注释 `@Documented`元注解表示该注解应该被包括在JavaDoc文档中。 ```java @Documented ...
@Retention(RetentionPolicy.RUNTIME) public @interface Tel { String message() default "电话号码格式不正确"; Class[] groups() default {}; Class[] payload() default {}; } ``` 四、使用自定义的 ...
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` 这里定义了一个名为`MyAnnotation`的注解,`Retention`指定其生命...
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` 这个例子定义了一个名为`MyAnnotation`的注解,它将在运行时可用,并且...
在定义注解时,通过`@Retention(RetentionPolicy.CLASS / SOURCE / RUNTIME)`指定。 6. 获取注解: 反射机制是获取注解的主要方式,通过`AnnotatedElement`接口的实现类(如`Class`, `Method`, `Field`等)的`...
Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface QueryObject { String name() default ...
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 定义自定义Annotation @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TestMethod {...
### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...
在Java编程语言中,注解(Annotation)是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不必修改代码的行为。自定义注解允许开发人员创建自己的注解类型,以满足特定项目或框架的需求。在这个名为...
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` - `@Retention`定义了注解的存活期,`@Target`指定注解可以应用到的...