注解有三个可见性:
源码可见(SOURCE)
字节码可见(CLASS)
运行时可见(RUNTIME)
这三个可见性是层层递增的,也就是说运行时可见的注解在前两种状态都是可见的。
下面来验证说明下
三个注解源码:
TestAnnoRetentionSource:
@Retention(RetentionPolicy.SOURCE) @Target(ElementType.FIELD) public @interface TestAnnoRetentionSource { }
TestAnnoRetentionClass:
@Retention(RetentionPolicy.CLASS) @Target(ElementType.FIELD) public @interface TestAnnoRetentionClass { }
TestAnnoRetentionRuntime:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface TestAnnoRetentionRuntime { }
测试类如下:
public class AnnotationTest { @TestAnnoRetentionSource public int sourceVisible; @TestAnnoRetentionClass public int classVisible; @TestAnnoRetentionRuntime public int runtimeVisible; public static void main(String[] args) { Class<AnnotationTest> clazz = AnnotationTest.class; for (Field each : clazz.getFields()) { System.out.println(each.getName() + ":"); for (Annotation anno : each.getAnnotations()) { System.out.println("\t" + anno.annotationType().getName()); } System.out.println(); } } }
可以看到三个注解类分别对应三个可见性,并且测试类中三个实例变量也分别用对应的注解修饰。
测试类输入是:
sourceVisible: classVisible: runtimeVisible: cn.teaey.test.annotation.TestAnnoRetentionRuntime
到现在我们能知道,只有课件性为Runtime的注解在我们代码运行的时候能够获取到。
再用javap命令查看下测试类的字节码(class)文件
命令:javap -verbose AnnotationTest
输入(部分):
1. const #5 = Asciz sourceVisible;
2. const #7 = Asciz classVisible;
3. const #8 = Asciz RuntimeInvisibleAnnotations;
4. const #9 = Asciz Lcn/teaey/test/annotation/TestAnnoRetentionClass;;
5. const #10 = Asciz runtimeVisible;
6. const #11 = Asciz RuntimeVisibleAnnotations;
7. const #12 = Asciz Lcn/teaey/test/annotation/TestAnnoRetentionRuntime;;
第1行能看出,sourceVisible在class字节码中没有任何注解修饰
第2、3、4行可以看出,classVisible变量被一个RuntimeInvisibleAnnotations运行时不可见的注解TestAnnoRetentionClass修饰
第5、6、7行说明,runtimeVisible变量被一个RuntimeVisibleAnnotations运行时可见的注解TestAnnoRetentionRuntime修饰。
总结:
SOURCE:只存在于JAVA源码(.java)文件中
CLASS:存在于JAVA源码和字节码(.class)文件中
RUNTIME:在源码、字节码中可见,同时可以在代码中访问
相关推荐
3. **运行时可见性**:有些 Annotation 在编译时有效,有些在运行时有效。例如,`@Override` 只在编译时检查,而 `@Retention(RetentionPolicy.RUNTIME)` 注解的 Annotation 可以在运行时通过反射获取。 五、...
@Retention 定义了注解的保留策略,可以是SOURCE(源码级别,编译后丢弃)、CLASS(类文件级别,运行时不可见)或 RUNTIME(运行时级别,可以通过反射访问)。 3.3 @Target @Target 指定注解可以应用的目标,如...
此外,还可以使用Java 8以后的元数据API(如`@Retention`、`@Target`)来控制Annotation的行为,如其在编译时、运行时的可见性以及作用域。 三、Annotation的生命周期 1. `@Retention`:此Annotation控制...
- `java.lang.annotation.Retention`:用于控制注解的生命周期,决定它在哪些阶段可见。有三种策略: - `SOURCE`:注解仅存在于源码中,编译后不再保留,如`@Override`和`@SuppressWarnings("unused")`。 - `...
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType....
选择不同的策略会影响注解的可见性和用途。 3. **@Documented**:此元注解表明应该将注解包含在生成的Javadoc文档中,使得其他开发者能了解到该注解的存在和含义。 4. **@Inherited**:此元注解表明子类会继承父类...
Java Annotation Overview是Java编程语言中一个重要的特性,它允许开发者向源代码中添加元数据,这些数据不直接影响程序的运行,但可以被编译器、IDE或其他工具使用。本篇文章将深入探讨Java注解的基本概念、用途...
### Annotation在Java中的深入解析与应用 #### 一、Annotation概览 Annotation,中文译为“注解”,是Java 5引入的一种元数据机制,用于向编译器或运行时环境提供额外的信息。注解本质上是一种特殊的注释,但它比...
Java注解(Annotation)是Java语言中的一个重要特性,自Java 1.5版本引入以来,它在软件开发中扮演了不可或缺的角色。注解是一种元数据,它可以附加到源代码的不同元素上,如类、方法、变量等,提供了额外的信息,...
* 属性的可见性只有 public 和 default,不写则默认为 default * 属性的类型只能支持基本数据类型、String、Class、Enum、Annotation 类型及以上类型的数组 * 可以加上 default 关键字指明默认值,当某字段不指明...
具体来说,`Target`允许我们指定标注的应用场景,而`Retention`则决定了标注在编译和运行时的可见性。这种机制极大地丰富了Java语言的能力,使得开发者能够在不影响核心逻辑的同时,通过添加额外的元数据来增强代码...
- 使用元注解如`@Target`和`@Retention`来控制自定义注解的行为和可见性。 5. **元注解的应用示例** 例如,创建一个只能应用于方法的注解`@Logged`,并且在Javadoc中可见,代码可能如下: ```java @Retention...
`@Target`定义了注解可以应用于哪些程序元素(如类、方法、字段等),`@Retention`指定了注解的生命周期,如是否在运行时可见。例如,`RetentionPolicy.RUNTIME`表示注解将在运行时可用,以便在程序运行时进行检查或...
Java SE 5.0 API中引入了`java.lang.reflect.AnnotatedElement`接口,它定义了用于反射性读取标注信息的四种方法: 1. **getAnnotation(Class annotationType)**:如果元素具有指定类型的标注,则返回这些标注;...
总结起来,Java注解是一种强大的工具,可以增强代码的可读性、可维护性和功能性。从简单的文档生成到复杂的编译时和运行时控制,注解在Java开发中扮演着不可或缺的角色。学习并熟练掌握注解的使用,能显著提高开发...
自定义注解需要定义注解的元数据,包括保留策略(Retention Policy),如SOURCE、CLASS或RUNTIME,分别表示注解只在源代码、编译后的类文件或运行时可见。还需要指定注解的处理方式(Processor),这可能是编译时的...
通过上述内容,你应该对Java的注解有了基本的理解,它极大地提高了代码的可读性和维护性,简化了各种框架的配置,并为构建更复杂的工具和系统提供了可能。在实际编程中,熟练掌握注解的使用将有助于提升开发效率和...
`@Retention`控制注解的生命周期,`RetentionPolicy.RUNTIME`意味着注解将在运行时可见,可以被反射访问。`@Documented`指示注解应该包含在生成的文档中,而`@Inherited`允许子类继承父类的注解。 自定义注解是Java...
通过元注解,我们可以控制注解的可见性、生命周期以及在编译过程或运行时如何处理这些注解。 1. **@Target**: 这个元注解定义了自定义注解可以应用的程序元素类型。例如,`@Target(ElementType.FIELD)` 表示注解...
通过元注解,开发者可以更加精细地控制注解的行为,例如决定注解的可见性、生命周期以及它们能应用到的程序元素。这在设计框架、库或实现特定编程模式时非常有用。元注解扩展了Java语言的功能,使得注解不仅限于代码...