`

告知编译程序如何处理@Retention

阅读更多

告知编译程序如何处理@Retention:

java.lang.annotation.Retention型态可以在您定义Annotation型态时,指示编译程序该如何对待您的自定义Annotation型态。

预定义上编译程序会将Annotation信息留在.class文档中,但不被虚拟机读取,而仅用于编译程序或工具程序运行时提供信息。

java.lang.annotation.RetentionPolicy 有三个枚举类型:CLASS、RUNTIME、SOURCE

只有当Annotation被指示成RUNTIME时,在运行时通过反射机制才能被JVM读取,否则,JVM是读取不到这个Annotation的。

 

java 代码
  1. package com.test;   
  2.   
  3. import java.lang.annotation.Retention;   
  4. import java.lang.annotation.RetentionPolicy;   
  5.   
  6. @Retention(RetentionPolicy.RUNTIME)   
  7. public @interface RetentionTest {   
  8.     String hello() default "hello";   
  9.     String world();   
  10. }   

 

java 代码
  1. package com.test;   
  2.   
  3. public class MyTest {   
  4.     @RetentionTest(hello = "beijing", world = "shanghai")   
  5.     @Deprecated  
  6.     @SuppressWarnings("unchecked")   
  7.     public void output()   
  8.     {   
  9.         System.out.println("output");   
  10.     }   
  11. }   

 

java 代码
  1. package com.test;   
  2.   
  3. import java.lang.annotation.Annotation;   
  4. import java.lang.reflect.Method;   
  5.   
  6. public class ReflectRetentionTest {   
  7.   
  8.     public static void main(String[] args) throws Exception{   
  9.         MyTest mt = new MyTest();   
  10.         Class c = MyTest.class;   
  11.         Method method = c.getMethod("output",new Class[]{});   
  12.         if(method.isAnnotationPresent(RetentionTest.class))   
  13.         {   
  14.             method.invoke(mt, new Object[]{});//output   
  15.                
  16.             RetentionTest  retentionTest = method.getAnnotation(RetentionTest.class);   
  17.                
  18.             System.out.println(retentionTest.hello());//beijing   
  19.             System.out.println(retentionTest.world());//shanghai   
  20.         }   
  21.            
  22.         Annotation[] annotations = method.getAnnotations();   
  23.         for(Annotation annotation: annotations)   
  24.         {   
  25.             System.out.println(annotation.annotationType().getName());   
  26.         }   
  27.         //for循环里输出的结果是com.test.RetentionTest以及java.lang.Deprecated,而没有出来java.lang.SuppressWarnings   
  28.         //因为java.lang.SuppressWarnings的Retention是被设置成RetentionPolicy.SOURCE类型的,所以在运行时是不会被虚拟机读取的。   
  29.     }   
  30. }  
分享到:
评论

相关推荐

    Java注解之Retention、Documented、Inherited介绍

    Retention注解用于定义一个注解的生存周期,即在程序的哪个阶段仍然有效。Java提供了三种RetentionPolicy策略: - `RetentionPolicy.SOURCE`:注解只存在于源代码阶段,编译后不会保留。这通常用于编译器的语法...

    达梦修改UNDO_RETENTION.zip

    1. **了解业务需求**:首先,你需要理解你的应用程序的事务特性,包括平均事务持续时间、事务回滚频率等。这将帮助你确定合理的UNDO_RETENTION值。 2. **监控当前设置**:通过查询数据库的系统视图,你可以查看当前...

    Java元注解是Java注解的重要特性,下面我就来详解常见的4大Java元注解

    Java 元注解包括四大类:@Retention、@Target、@Documented、@Inherited 等。 1.@Retention @Retention 用于指定注解的保留期限,可以设置为 SOURCE、CLASS 或 RUNTIME。 * RetentionPolicy.SOURCE:注解只保留在...

    编译时注解

    编译时注解,顾名思义,就是这些注解在编译阶段起作用,它们对程序的运行时行为没有直接影响,但能帮助编译器进行检查或生成额外的辅助文件。 ## 1. 注解类型 Java中的注解分为三种类型:源码保留(Source ...

    自定义注解使用

    1. **编译时处理(Compile-Time Processing)**:通过`@Retention(RetentionPolicy.SOURCE)`或`@Retention(RetentionPolicy.CLASS)`指定注解只在源码或字节码阶段有效,常用于代码生成、格式检查等。Java编译器在...

    注解与反射高效开发法.pdf

    3. 运行时注解,即标记为@Retention(RetentionPolicy.RUNTIME)的注解,这种注解既会在编译时被处理,也会在运行时被JVM保留,从而可以通过反射机制在程序运行期间访问和操作。 Java反射机制则允许在运行时动态地...

    注解的使用 注释文档的生成

    @Retention(RetentionPolicy.RUNTIME ) SOURCE 给编译器看的# 源码存在,字节码不存在 CLASS 给虚拟机的类加载器看的,#源码,.class存在, RUNTIME 用于反射 #源码,.class 字节码 存在 @Documented 这个注解可以...

    java注解详解

    Java 注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。 一、元注解 元注解是指注解的注解。包括 @...

    Java注解笔记源代码

    1. **编译时处理**:通过`@Retention(RetentionPolicy.CLASS)`或`@Retention(RetentionPolicy.SOURCE)`,注解可以在编译时被处理。编译器可以检查注解并采取相应行动,例如,检查`@Override`是否真的重写了父类方法...

    【java元注解】相关资源

    在实际编程中,这些元注解可以帮助我们更好地控制和利用自定义注解,实现如代码注释、编译时检查、运行时处理等多种功能。例如,通过`@Retention(RetentionPolicy.RUNTIME)`,我们可以编写代码在运行时通过反射机制...

    JDK1.5 注释语法(Annotations)新鲜试用

    在Java编程语言中,JDK 1.5引入了一项重要的新特性——注释(Annotations),这是一种元数据,用于提供程序元素(如类、方法、变量等)的附加信息。这些信息可以被编译器、IDE或其他工具用来验证代码、生成代码、...

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

    Java自定义注解是Java语言中的一个重要特性,它允许开发者在代码中添加元数据,以提供额外的信息,比如编译时或运行时的处理规则。注解与传统的注释不同,注解可以被编译器或者JVM读取并执行相应的处理。在Java中,...

    java 注解开发(包含详细注释,项目可以直接运行)

    - 使用`@Processor`注解定义注解处理器,可以在编译时处理注解信息,例如代码生成、编译检查等。 - Java的`Processor`接口是JSR 269的一部分,实现了该接口的类会在编译期间被调用。 5. **注解的使用场景** - **...

    编译注解实现bindView/contentView框架的Demo

    在Java中,我们可以使用`@Retention(RetentionPolicy.SOURCE)`或`@Retention(RetentionPolicy.CLASS)`声明编译时注解。 接下来,我们来看如何实现`@BindView`和`@ContentView`这两个注解。`@BindView`用于将XML布局...

    入门级java 注解学习示例代码

    注解在Java中主要用来简化配置、提供编译时和运行时的元信息、实现自动化的处理任务等。 **注解的类型** 1. **源码级注解(Source-level Annotations)**:这些注解在编译期间由编译器处理,例如`@Override`用于...

    使用Java自定义注解模拟实现SpringBoot相关注解.zip

    要模拟实现这个功能,我们需要创建一个自定义注解,例如`@MyAutowired`,然后编写一个处理该注解的后处理器,使用Java的反射API来查找和注入依赖。 ```java @Retention(RetentionPolicy.RUNTIME) @Target(Element...

    02-Java注解面试题(2题)-新增.pdf

    Annotation 是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation 对象,然后通过该 Annotation 对象来获取注解中的元数据信息。 在 Java 中,Annotation 可以被用于提供元数据信息,例如:作者、版本号...

    Java Annotation的讲解和例子

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

    Java自定义注解Annotation的使用

    注解本身并不会对程序的行为产生直接影响,它只是提供了额外的信息。通常需要通过反射机制来读取这些信息并执行相应的操作。例如: ```java public static void process(String str) throws ClassNotFoundException...

Global site tag (gtag.js) - Google Analytics