@Retention是java当中的一个元注解,该元注解通常都是用于对软件的测试

1、适用方式:

    @Retention(RetentionPolicy.RUNTIME)

    @interface Task{.......}

    参数RetentionPolicy.RUNTIME就说明了,@Task注解在程序运行时是可见的

    RetentionPolicy的枚举类型还有SOURCE、CLASS分别指定注解对于那个级别是可见的,但是

    我们一般都是用RUNTIME,因为这是在程序运行时可以对注解进行读取,从而易于软件的测试

2、接下来我们要先介绍一下java程序的内省和反射机制,之后在讨论@Retention的具体用法实例

   在java虚拟机JVM在运行时,就会将类进行加载,这时,每个类都会生成一个Class数据类型的

   对象(Class类在java.lang.Class中),这个对象就是对应类的“运行时对象”,通过这个

   运行时对象,就能够获取对应类的许多信息,也就是说,运行时对象实际就是对应类的一个映射

   这就java的内省反射机制

 

 

3、接下来我们讨论一下,这个Class运行时对象的使用

   ①获取对应类的Class数据类型的运行时对象的引用——getClass()

     public class Point{.....} //声明一个类

     Point pt = new Point(); //创建对应类的实例对象

     Class cls = pt.getClass() ;    //则cls 就指向了Point类的运行时对象

   ②运行时对象cls的成员函数

     <1>public String  getName()

        返回对应类的类名

     <2>public boolean isAnnotationPresent(注解名.class)

     判定指定的"注解"是否在运行时注解了 cls 的对应类

     <3>public boolean isAnnotation();

     判定cls 是否在运行时被任何注解 注解过

     <4>public A getAnnotation(注解名.class)

     A 指的是一个注解的类型,具体用法如下:

     @Retention(RetentionPolicy.RUNTIME) //指定@Task运行时可见

     @interface Task{String descirption(); }

     @Task(descroption="NoFinished")   //为computer作注

     class Computer{.....} 

 

     则  Computer my = new Computer() ;

         Class cls = my.getClass() ;

         Task tk = (Task) cls.getAnnotation(Task.class);

         //这时 tk 就指向了标注Computer的注解@Task

         tk.description(); //调用@Task中的description(),输出"NoFinishing"

    <5> public Method[] getMethods()

        返回由对应类中的所有的方法形成的Method数组,每个Method对象都唯一对应

        一个对应类中的方法,通过Method[i]就可以获得对应方法的信息

        (Method类在java.lang.reflect.Method中)

3、这个Method类也有很多成员方法,用来获取对应的方法的信息

   如也有:

       public boolean isAnnotationPresent(注解名.class)

       判定对应的方法是否被指定的注所注解

       public A getAnnotation(注解名.class)

       用法和上面的讲述的一样,之不过创建的注解型的引用变量指向的是 "标记对应方法的注解"

 

 

4、上面将所有的成员方法只有在注解运行时可见的情况下才能够发挥作用,

    所以@Retention变得很有用

@Retention的用法实例:

  

运行结果:

 

Java元注解@Retention规则的更多相关文章

  1. Java元注解—— @Retention @Target @Document @Inherited

    java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy. ...

  2. java元注解 @Retention注解使用

    @Retention定义了该Annotation被保留的时间长短: 1.某些Annotation仅出现在源代码中,而被编译器丢弃: 2.另一些却被编译在class文件中,注解保留在class文件中,在 ...

  3. 使用Java元注解和反射实现简单MVC框架

    Springmvc的核心是DispatcherServlet来进行各种请求的拦截,进而进行后续的各种转发处理.流程图如下: 说明:客户端发出一个http请求给web服务器,web服务器对http请求进 ...

  4. Spring注解与Java元注解小结

    注解 Annotation 基于注解的开发,使得代码简洁,可读性高,简化的配置的同时也提高了开发的效率,尤其是SpringBoot的兴起,随着起步依赖和自动配置的完善,更是将基于注解的开发推到了新的高 ...

  5. Java 元注解

    元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elemen ...

  6. Java元注解

    元注解是指注解的注解,包括@Retention @Target @Document @Inherited四种. 1.@Retention: 定义注解的保留策略@Retention(RetentionP ...

  7. java元注解(注解在注解上的注解)

    //ElementType.TYPE 给类.接口.枚举上使用 @Target(ElementType.TYPE)//给注解进行注解,表示该注解可以用在什么地方 //@Retention(Retenti ...

  8. Java元注解,简单案例

    [注解] 程序中有 注释 和注解 * 注释:给开发人员. * 注解:给计算机看的. 注解使用:学习框架支持注解开发. [JDK提供的注解] @Override :描述方法的重写. @SuppressW ...

  9. java的四个元注解 @Retention @Target @Document @Inherited

    1.  @Retention  :注解的保留位置 @Retention(RetentionPolicy.SOURCE)  //注解仅存在于源码中,在class字节码文件中不包含 @Retention( ...

随机推荐

  1. [书籍精读]《React Native精解与实战》精读笔记分享

    写在前面 书籍介绍:本书由架构师撰写,包含ReactNative框架底层原理,以及与iOS.Android混合开发案例,精选了大量实例代码,方便读者快速学习.主要内容分为两大部分,第1部分" ...

  2. 《Spring In Action》阅读笔记之核心概念

    DI 依赖注入:在xml中配置的bean之间的依赖关系就是依赖注入 AOP 面向切面编程:如在xml中定义某个方法为切点,然后配置在该切点(该方法)调用前后需要调用的方法,从而简化了代码并解耦. Sp ...

  3. 大数据Hbase相关运维题

    1.启动先电大数据平台的 Hbase 数据库,其中要求使用 master 节点的RegionServer.在 Linux Shell 中启动 Hbase shell,查看 HBase 的版本信息.(相 ...

  4. VSCode六大通用插件真香合集

    目录 一.background:设置心水背景图 安利理由: 安装及设置步骤: 设置过程中使用的代码: 成果展示: 注意: 二.Material Theme(VSCode主题)+Material Ico ...

  5. s2h-HTTP Status 404 - No result defined for action and result input错误解决

    今天做个小项目,用的是ssh,结果在运行的时候出现HTTP Status 404 - No result defined for action and result input的错误. 首先认真检查所 ...

  6. Java 中正则表达式使用

    正则表达式基本用法: 测试代码: @Test public void test01() { String str = "adsfd##4324"; // 创建正则表达式对象 Pat ...

  7. for嵌套setTimeout的心得

    export default { data() { return { dialogList: [] } }, created() { this.setList() }, methods: { setL ...

  8. JS面向对象编程之封装

    来源:https://segmentfault.com/a/1190000015843072 我们所熟知的面向对象语言如 C++.Java 都有类的的概念,类是实例的类型模板,比如Student表示学 ...

  9. 数据包的抓取[tcpdump]的应用

    [root@server ~]# yum install tcpdump [root@server ~]# yum install wireshark 1.默认情况下,直接启动tcpdump将监视第一 ...

  10. 新版gitbook导出pdf

    文章目录 gitbook自带的npm模块gitbook 使用vscode的插件Markdown PDF 使用CommandBox GitBook Exporter 最近想把自己写的一个gitbook转 ...