自定义注解 红太狼 2022-03-19 08:51 305阅读 0赞 转载:[https://my.oschina.net/itblog/blog/1525665][https_my.oschina.net_itblog_blog_1525665] 写了一个自定义注解: package com.my.test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface MyAnnotation { String value(); } 定义了一个类A,并用MyAnnotation标注。测试类中: package com.my.test; @MyAnnotation("This is MyAnnotation. ^_^") class A {} public class Test { public static void main(String[] args) { MyAnnotation annotation = A.class.getAnnotation(MyAnnotation.class); if (annotation != null) { System.out.println(annotation.value()); } else { System.out.println("No such annotation."); } } } 执行结果: No such annotation. 如果把MyAnnotation类的Retention改为RetentionPolicy.CLASS,结果还是No such annotation。 如果改为RetentionPolicy.RUNTIME,此时的结果为: This is MyAnnotation. ^_^ **描述** 在JavaDoc中,RetentionPolicy是这样描述的: <table> <thead> <tr> <th>RetentionPolicy</th> <th>说明</th> <th>举例</th> </tr> </thead> <tbody> <tr> <td>SOURCE</td> <td>注解只保留在代码中,class文件中没有</td> <td>@Override, @SupressWarnings</td> </tr> <tr> <td>CLASS</td> <td>注解会保留在class文件中,但运行时不能取得</td> <td>@Override, @SupressWarnings</td> </tr> <tr> <td>RUNTIME</td> <td>注解会保留在class文件中,而且运行时可以取得</td> <td>@Deprecated</td> </tr> </tbody> </table> 可以理解的是,@Override注解只是为了编译器能检查是否当前的方法真的是在复写父类的方法,而@SuppressWarnings也只是为了抑制代码中的警告而已,在代码编译之后并没有作用,所以不需要写在CLASS文件中,于是,这类注解的RetentionPolicy自然应该为SOURCE。 验证 为了验证以上说明,接下来,我们使用javap工具把标注有MyAnnotation注解的类A的class文件进行反编译。 **RetentionPolicy.SOURCE** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg2ODYzOA_size_16_color_FFFFFF_t_70] **RetentionPolicy.CLASS** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg2ODYzOA_size_16_color_FFFFFF_t_70 1] 可以看到: * 中间包含了RuntimeInvisibleAnnotations这一部分,表明注解确实已经写入到class文件中,而且是**运行时不可见的(RuntimeInvisibleAnnotations)** * 而在常量池中,可以清楚的看到自定义注解的权限定类名,注解的属性,和属性的值均被写入到class中,而且是常量 **RetentionPolicy.RUNTIME** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg2ODYzOA_size_16_color_FFFFFF_t_70 2] 可以看到: * 和CLASS一样,中间也包含了RuntimeInvisibleAnnotations这一部分,但注解是运行时可见的(RuntimeVisibleAnnotations) * 和CLASS一样,注解的权限定类名,注解的属性,和属性的值同样被写入到class的常量池中 到这里可以得出以下结论: * 一个带注解的类在编译后,如果注解的RetentionPolicy是CLASS或RUNTIME,那么此注解的信息会被记录到类的量池中 * 如果要在代码中获取注解,需要把Retention设置为RetentionPolicy.RUNTIME [https_my.oschina.net_itblog_blog_1525665]: https://my.oschina.net/itblog/blog/1525665 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg2ODYzOA_size_16_color_FFFFFF_t_70]: /images/20220319/6c88dc2762944543a8ceaef34fca4874.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg2ODYzOA_size_16_color_FFFFFF_t_70 1]: /images/20220319/8cb61f47553247e78ab3784d64e884ac.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjg2ODYzOA_size_16_color_FFFFFF_t_70 2]: /images/20220319/d363855514354e8e85cb76d94675556e.png
相关 自定义注解 自定义注解关键词 @interface。具体实现可参考下面代码。 @Target({ ElementType.FIELD}) @Retention(Reten 本是古典 何须时尚/ 2022年12月05日 09:59/ 0 赞/ 229 阅读
相关 自定义注解 自定义注解 一、注解是什么? 二、使用步骤 1.使用关键字@interface @Target @Retention详解 一、注解是什么 ﹏ヽ暗。殇╰゛Y/ 2022年12月01日 11:57/ 0 赞/ 2 阅读
相关 自定义注解 1、简单介绍注解 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明 旧城等待,/ 2022年10月09日 03:11/ 0 赞/ 223 阅读
相关 自定义注解 什么是注解? 从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加 素颜马尾好姑娘i/ 2022年09月02日 04:18/ 0 赞/ 241 阅读
相关 自定义注解 首先定义注解类: import java.lang.annotation.; @Documented @Target(ElementType.METHOD) @Ret 一时失言乱红尘/ 2022年07月20日 15:18/ 0 赞/ 283 阅读
相关 自定义注解 package cn.stu; import java.lang.annotation.Documented; import java.lan 本是古典 何须时尚/ 2022年07月15日 18:50/ 0 赞/ 210 阅读
相关 自定义注解 自定义注解 @Retention(RetentionPolicy.RUNTIME) // 元注解:注解的注解。此注解表示使注解保留到运行时。 @Target( ゝ一世哀愁。/ 2022年05月31日 12:24/ 0 赞/ 327 阅读
相关 自定义注解 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; 谁践踏了优雅/ 2022年03月30日 03:30/ 0 赞/ 325 阅读
相关 自定义注解 转载:[https://my.oschina.net/itblog/blog/1525665][https_my.oschina.net_itblog_blog_1525665 红太狼/ 2022年03月19日 08:51/ 0 赞/ 306 阅读
相关 自定义注解 注解是一种元数据形式,即注解是属于java的一种数据类型,和类、接口、数组、枚举类似。注解用来修饰,类、方法、变量、参数、包。注解不会对所修饰的代码产生直接的 痛定思痛。/ 2021年12月21日 11:51/ 0 赞/ 355 阅读
还没有评论,来说两句吧...