“JDK 的元 Annotation”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“1”的新页面)
 
第1行: 第1行:
1
+
=== @Retention ===
 +
@Retention 只能用于修饰一个 Annotation 定义,用于指定被修饰的 Annotation 可以保留多长时间,@Retention 包含一个 RetentionPolicy 类型的 value 成员变量,所以使用 @Retention 时必须为该 value 成员变量指定值。
 +
 
 +
value 成员变量的值只能是如下 3 个。
 +
 
 +
* RetentionPolicy.CLASS 编译器将把 Annotation 记录在 class 文件中。当运行 Java 程序时,JVM不再保留 Annotation。这是默认值
 +
* RetentionPolicy.RUNTIME 编译器将把 Annotation 记录在 class 文件中。当运行 Java 程序时,JVM 也会保留 Annotation,程序可以通过反射获取该 Annotation 信息。
 +
* RetentionPolicy.SOURCE Annotation 只保留在源代码中,编译器直接丢弃这种 Annotation。
 +
 
 +
如果需要通过反射获取注释信息,就需要使用 value 属性值为 RetentionPolicy.RUNTIME 的 @Retention。<syntaxhighlight lang="java">
 +
import java.lang.annotation.Retention;
 +
import java.lang.annotation.RetentionPolicy;
 +
 
 +
//定义下面的 Testable Annotation 保留到运行时
 +
@Retention(value = RetentionPolicy.RUNTIME)
 +
public @interface Testable {
 +
 
 +
}
 +
</syntaxhighlight>

2024年7月10日 (三) 10:14的版本

@Retention

@Retention 只能用于修饰一个 Annotation 定义,用于指定被修饰的 Annotation 可以保留多长时间,@Retention 包含一个 RetentionPolicy 类型的 value 成员变量,所以使用 @Retention 时必须为该 value 成员变量指定值。

value 成员变量的值只能是如下 3 个。

  • RetentionPolicy.CLASS 编译器将把 Annotation 记录在 class 文件中。当运行 Java 程序时,JVM不再保留 Annotation。这是默认值
  • RetentionPolicy.RUNTIME 编译器将把 Annotation 记录在 class 文件中。当运行 Java 程序时,JVM 也会保留 Annotation,程序可以通过反射获取该 Annotation 信息。
  • RetentionPolicy.SOURCE Annotation 只保留在源代码中,编译器直接丢弃这种 Annotation。

如果需要通过反射获取注释信息,就需要使用 value 属性值为 RetentionPolicy.RUNTIME 的 @Retention。

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

//定义下面的 Testable Annotation 保留到运行时
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Testable {

}