`
冲杯茶喝
  • 浏览: 30585 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Annotation Retention(可见性)

 
阅读更多

 注解有三个可见性:

源码可见(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:在源码、字节码中可见,同时可以在代码中访问

分享到:
评论

相关推荐

    JDK5.0 Java Annotation 介绍(ppt)

    3. **运行时可见性**:有些 Annotation 在编译时有效,有些在运行时有效。例如,`@Override` 只在编译时检查,而 `@Retention(RetentionPolicy.RUNTIME)` 注解的 Annotation 可以在运行时通过反射获取。 五、...

    Java Annotation手册

    @Retention 定义了注解的保留策略,可以是SOURCE(源码级别,编译后丢弃)、CLASS(类文件级别,运行时不可见)或 RUNTIME(运行时级别,可以通过反射访问)。 3.3 @Target @Target 指定注解可以应用的目标,如...

    JavaAnnotation手册.pdf

    此外,还可以使用Java 8以后的元数据API(如`@Retention`、`@Target`)来控制Annotation的行为,如其在编译时、运行时的可见性以及作用域。 三、Annotation的生命周期 1. `@Retention`:此Annotation控制...

    Java 5 annotation 学习笔记

    - `java.lang.annotation.Retention`:用于控制注解的生命周期,决定它在哪些阶段可见。有三种策略: - `SOURCE`:注解仅存在于源码中,编译后不再保留,如`@Override`和`@SuppressWarnings("unused")`。 - `...

    annotation

    import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType....

    基于Java注解(Annotation)的自定义注解入门介绍

    选择不同的策略会影响注解的可见性和用途。 3. **@Documented**:此元注解表明应该将注解包含在生成的Javadoc文档中,使得其他开发者能了解到该注解的存在和含义。 4. **@Inherited**:此元注解表明子类会继承父类...

    Java Annotation Overview详解

    Java Annotation Overview是Java编程语言中一个重要的特性,它允许开发者向源代码中添加元数据,这些数据不直接影响程序的运行,但可以被编译器、IDE或其他工具使用。本篇文章将深入探讨Java注解的基本概念、用途...

    Annotation

    ### Annotation在Java中的深入解析与应用 #### 一、Annotation概览 Annotation,中文译为“注解”,是Java 5引入的一种元数据机制,用于向编译器或运行时环境提供额外的信息。注解本质上是一种特殊的注释,但它比...

    Java注解Annotation解析

    Java注解(Annotation)是Java语言中的一个重要特性,自Java 1.5版本引入以来,它在软件开发中扮演了不可或缺的角色。注解是一种元数据,它可以附加到源代码的不同元素上,如类、方法、变量等,提供了额外的信息,...

    5分钟搞懂java注解@Annotation的具体使用

    * 属性的可见性只有 public 和 default,不写则默认为 default * 属性的类型只能支持基本数据类型、String、Class、Enum、Annotation 类型及以上类型的数组 * 可以加上 default 关键字指明默认值,当某字段不指明...

    Java软件开发实战 Java基础与案例开发详解 16-4 对标注进行标注 共11页.pdf

    具体来说,`Target`允许我们指定标注的应用场景,而`Retention`则决定了标注在编译和运行时的可见性。这种机制极大地丰富了Java语言的能力,使得开发者能够在不影响核心逻辑的同时,通过添加额外的元数据来增强代码...

    Java元注解.docx

    - 使用元注解如`@Target`和`@Retention`来控制自定义注解的行为和可见性。 5. **元注解的应用示例** 例如,创建一个只能应用于方法的注解`@Logged`,并且在Javadoc中可见,代码可能如下: ```java @Retention...

    真实案例!java自定义注解实战!.pdf

    `@Target`定义了注解可以应用于哪些程序元素(如类、方法、字段等),`@Retention`指定了注解的生命周期,如是否在运行时可见。例如,`RetentionPolicy.RUNTIME`表示注解将在运行时可用,以便在程序运行时进行检查或...

    Java软件开发实战 Java基础与案例开发详解 16-5 利用反射获取标注信息 共7页.pdf

    Java SE 5.0 API中引入了`java.lang.reflect.AnnotatedElement`接口,它定义了用于反射性读取标注信息的四种方法: 1. **getAnnotation(Class annotationType)**:如果元素具有指定类型的标注,则返回这些标注;...

    2020老杜最新Java零基础进阶视频教程-注解课件

    总结起来,Java注解是一种强大的工具,可以增强代码的可读性、可维护性和功能性。从简单的文档生成到复杂的编译时和运行时控制,注解在Java开发中扮演着不可或缺的角色。学习并熟练掌握注解的使用,能显著提高开发...

    通过Java注解实现安全控制

    自定义注解需要定义注解的元数据,包括保留策略(Retention Policy),如SOURCE、CLASS或RUNTIME,分别表示注解只在源代码、编译后的类文件或运行时可见。还需要指定注解的处理方式(Processor),这可能是编译时的...

    java的注解

    通过上述内容,你应该对Java的注解有了基本的理解,它极大地提高了代码的可读性和维护性,简化了各种框架的配置,并为构建更复杂的工具和系统提供了可能。在实际编程中,熟练掌握注解的使用将有助于提升开发效率和...

    Android Studio Annotation注解技术1

    `@Retention`控制注解的生命周期,`RetentionPolicy.RUNTIME`意味着注解将在运行时可见,可以被反射访问。`@Documented`指示注解应该包含在生成的文档中,而`@Inherited`允许子类继承父类的注解。 自定义注解是Java...

    Java元注解.pdf

    通过元注解,我们可以控制注解的可见性、生命周期以及在编译过程或运行时如何处理这些注解。 1. **@Target**: 这个元注解定义了自定义注解可以应用的程序元素类型。例如,`@Target(ElementType.FIELD)` 表示注解...

    java元注解.docx

    通过元注解,开发者可以更加精细地控制注解的行为,例如决定注解的可见性、生命周期以及它们能应用到的程序元素。这在设计框架、库或实现特定编程模式时非常有用。元注解扩展了Java语言的功能,使得注解不仅限于代码...

Global site tag (gtag.js) - Google Analytics