JAVA中的注解机制解读

 更新时间:2023年10月02日 09:03:02   作者:这堆干货有点猛  
这篇文章主要介绍了JAVA中的注解机制解读,通过调用Java的反射机制相关API来访问annotation信息,首先加载使用注解的类,得到class类,然后再得到类相应的方法,成员变量,需要的朋友可以参考下

不知道大家在平时用到注解的频率多不多,注解对我们的帮助很大,能为我们节省很多工作。最直接的就是可以代替配置文件的功能,无论是基本的servlet还是常用的三大框架,里面都使用了注解,并且逐渐的代替了原本繁琐的配置,大大提高了编码效率。

随着注解使用的越来越频繁,我们对底层实现的了解越来越少,所以在这一章我们来好好了解一下注解是怎么实现的。

首先注解是什么?通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明(比如 @Override),这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。

他的基本原理和流程就是:通过调用Java的反射机制相关API来访问annotation信息。首先加载使用注解的类,得到class类。然后再得到类相应的方法,成员变量。得到变量后调用相应的类、方法、成员变量的对象的isAnnotationPresent方法判断是否使用了注解。之后通过调用相应的类、方法、成员变量的的getAnnotation方法得到相应的注解的对象。接下来我们就可以操作注解对象完成相应的逻辑。

我们来熟悉一下注解的基本结构:

最上面的一部分注解叫做元注解,就是注解的注解。@Target 指的是这个注解可以用在什么地方。他的参数可以有如下:

接着就是@Retention了,它指的是这个注解的生命周期。他的参数可以包括SOURCE、CLAS和 RUNTIME。

SOURCE:如果Retention成员取值为SOURCE,表明该注解只存在源代码当中,在编译的时候会被编译器丢掉。如重写方法时,方法上面会有@Override注解,这个注解就是source类型的。

CLASS:表示注解会被存到字节码文件.class中,但是虚拟机载入class文件的时候不会将注解导入,因此运行时无法得到。如果不在注解中使用Retention指定,则默认的保留策略为CLASS。

RUNTIME:不仅保存到class文件,还会被虚拟机载入内存,因此在运行的时候可以通过反射得到并且使用这些注解。我们待会的例子就是以RUNTIME为例。

而 @Inherited和@Documented表达的意思比较简单:@Inherited 表示子类可以继承父类的注解(有空会细讲);@Documented 表示生成doc文档的时候会包含这个注解。

“public @interface Anno”则是定义注解的关键字以及名字。接下来就是一些成员变量了,注意:这里是变量,不要以为有个括号就是方法了。使用方式是这样的@Anno(name="wizard",age=12) 。

注意:成员变量只能是基本类型、String、class、enum、Annotation和以上类型的数组,而且必须是无参数、不能抛出异常。

到此这篇关于JAVA中的注解机制解读的文章就介绍到这了,更多相关JAVA注解机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解java面试题中的i++和++i

    详解java面试题中的i++和++i

    这篇文章主要介绍了java面试题中的i++和++i的相关资料,需要的朋友可以参考下
    2018-03-03
  • Java中进程、协程与线程的区别详解

    Java中进程、协程与线程的区别详解

    这篇文章主要介绍了Java中进程,线程,协程的概念、区别以及使用场景的选择,早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是"单进程时代",一切的程序只能串行发生,需要的朋友可以参考下
    2023-08-08
  • Struts2拦截器Interceptor的原理与配置实例详解

    Struts2拦截器Interceptor的原理与配置实例详解

    拦截器是一种AOP(面向切面编程)思想的编程方式.它提供一种机制是开发者能够把相对独立的代码抽离出来,配置到Action前后执行。下面这篇文章主要给大家介绍了关于Struts2拦截器Interceptor的原理与配置的相关资料,需要的朋友可以参考下。
    2017-11-11
  • java实现的导出Excel工具类实例

    java实现的导出Excel工具类实例

    这篇文章主要介绍了java实现的导出Excel工具类,结合具体实例形式分析了java导出Excel导出并生成Excel表格相关操作技巧与注意事项,需要的朋友可以参考下
    2017-10-10
  • Java网络编程中的TCP/UDP详解

    Java网络编程中的TCP/UDP详解

    这篇文章主要介绍了Java网络编程中的TCP/UDP详解,网络编程是指编写运行在多个设备的程序,这些设备都通过网络连接起来,java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节,需要的朋友可以参考下
    2023-12-12
  • Java中性能优化的35种方法汇总

    Java中性能优化的35种方法汇总

    很多同学在日常写Java的时候很少去关心性能问题,但是在我们写代码的过程中必须考虑到性能对程序的影响。小到我们使用位运算来实现算术运算,大到我们对 Java 代码的总体架构设计,性能其实离我们很近。本文介绍了Java中性能优化的35种方法,需要的朋友可以参考下。
    2017-01-01
  • Java concurrency集合之CopyOnWriteArraySet_动力节点Java学院整理

    Java concurrency集合之CopyOnWriteArraySet_动力节点Java学院整理

    CopyOnWriteArraySet基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent(若没有则增加)方法
    2017-06-06
  • java对象数组实现学生信息管理系统

    java对象数组实现学生信息管理系统

    这篇文章主要为大家详细介绍了java对象数组实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • IntelliJ IDEA 2023.2正式发布新UI和Profiler转正(最新推荐)

    IntelliJ IDEA 2023.2正式发布新UI和Profiler转正(最新推荐)

    北京时间2023年7月26日,IntelliJ IDEA 2023.2正式发布,IntelliJ IDEA 2023.2 引入 AI Assistant(AI助手),通过一组由 AI 提供支持的功能助力开发,今天给大家分享IntelliJ IDEA 2023.2正式发布新UI和Profiler转正,感兴趣的朋友一起看看吧
    2023-10-10
  • Java字符串操作和C#字符串操作的不同小结

    Java字符串操作和C#字符串操作的不同小结

    在JAVA语言中,字符串数据实际上由String类所实现的。下面这篇文章主要给大家介绍了关于Java字符串操作和C#字符串操作的不同的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-12-12

最新评论