关于Java注解的一些理解 小结

这篇具有很好参考价值的文章主要介绍了关于Java注解的一些理解 小结。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 常用注解和理解

2. 自定义注解

2.1 案例背景

2.2 设计思路

3 总结


1. 常用注解和理解

注解在我的理解下,就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。

可能有些抽象,简单来说注解其实在开发中是非常常见的,比如我们在使用各种框架时(Spring)就会用到非常多的注解,@Controller/@Param / @Select 等。

除了框架实现的注解,Java原生也有@Overrided、@Deprecated、@FunctionalInterface等基本注解,不过Java原生注解大多数用于标记和检查。除了这些基本注解之外,还有一种叫做元Annotation,用来修饰注解的,常用的元注解有@Retention和@Target。

  • @Retention注解可以简单理解为设置注解的生命周期。
  • @Target可以理解为注解的修饰对象(方法、成员变量、包等)。

2. 自定义注解

2.1 案例背景

假设现在有个监控告警系统,我们需要将一些程序的审计日志,比如成功/失败日志,通过自定义注解的方式设置监控指标,如果这些逻辑在业务代码中混合就会显得不那么优雅。

2.2 设计思路

类似这种监控信息显然都可以通过AOP切面的方式去处理,而如果使用注解配置相关的信息,配合AOP解析就会比较优雅。

自定义注解首先考虑我们是在何时解析这个注解,需要用到@Retention注解,这个注解会修饰我们自定义注解的生命周期,@Retention注解传入的是RetentionPolicy枚举,包括SOURCE、CLASS和RUNTIME

理解这块就得了解从java文件到class文件再到class被jvm加载的过程了。

关于Java注解的一些理解 小结

从上图可以发现有个注解抽象语法树,这里其实就回去解析注解,然后做逻辑处理。

重点是,如果想在编译期间处理注解相关的逻辑,需要集成AbstractProcessor并实现process方法,比如lombok就是通过AnnotationProcessor集成了AbstractProcessor。

一般只要自定义注解中@Retention注解设置为SOURCE和CLASS这两种级别就需要继承并实现,因为这两个级别加载到jvm的时候,注解就被抹除了。

比如lombok的@Data注解能有getter/setter等方法,就是在这个时候加上去的。

所以一般来说自定义注解都是什么级别?

一般来说我们自定义注解都是RUNTIME级别的,因为大多数情况我们是根据运行时环境去做处理,因为反射是Java获取运行时信息的重要手段,自定义注解需要配合反射来使用。

@Around("@annotation(com.sanwai.service.openapi.monitor.Monitor)")
public Object antispan(ProceedingJoinPoint pjp) throws Throwable {

    String functionName = pjp.getSignature().getName();
    Map<String, String> tags = new HashMap<>();

    logger.info(functionName);

    tags.put("functionName", functionName);
    tags.put("flag", "done");

    monitor.sum(functionName, "start", 1);

    //方法执行开始时间
    long startTime = System.currentTimeMillis();

    Object o = null;
    try {
        o = pjp.proceed();
    } catch (Exception e) {
        //方法执行结束时间
        long endTime = System.currentTimeMillis();

        tags.put("flag", "fail");
        monitor.avg("rt", tags, endTime - startTime);

        monitor.sum(functionName, "fail", 1);
        throw e;
    }

    //方法执行结束时间
    long endTime = System.currentTimeMillis();

    monitor.avg("rt", tags, endTime - startTime);

    if (null != o) {
        monitor.sum(functionName, "done", 1);
    }
    return o;
}

3 总结

注解是代码的特殊标记,可以在编译、类加载、运行时被读取,对应了RetentionPolicy的三种级别。

SOURCE和CLASS级别需要继承AbstractProcessor,实现process方法处理自定义注解的逻辑,而RUNTIME是我们日常开发用的最多的,配合反射机制可以在很多场景优化代码。文章来源地址https://www.toymoban.com/news/detail-422528.html

到了这里,关于关于Java注解的一些理解 小结的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring MVC中的一些常用注解

    Spring MVC中的一些常用注解

    目录 @RequestMapping 实现路由映射 限制请求方式 @PathVariable 从url中获取变量的值 更改绑定参数的名字 @RequestParam 可以传递集合  更改绑定参数的名字 可修改是否为必传参数 @RequestBody 获取请求正文的内容  可修改是否为必传参数 @RequestPart 可以支持上传文件 更改绑定参数的名字

    2024年01月19日
    浏览(15)
  • 【Springboot系列】SpringBoot常用的一些注解

    【Springboot系列】SpringBoot常用的一些注解

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 引言: Spring Boot 是当今 Java 开发领域中最受欢迎的框架之一,它的出现极大地简化了 Spring 应用程序的开发和部署过程。 其中,注解是 Spring Bo

    2024年04月09日
    浏览(7)
  • 关于微服务治理的一些理解

    关于微服务治理的一些理解

    根本意义 其主要目的还是为了解耦,提高灵活性和可扩展性! 参考:https://zhuanlan.zhihu.com/p/462078779 相比单体 单体架构的性能高于微服务架构,微服务的负载能力低于单体架构. 微服务通信之间存在网络IO消耗 ; 单体模块紧耦合,扩展性差; 微服务的敏捷性高,每一个人负责

    2024年02月13日
    浏览(9)
  • 关于java垃圾回收的小结

    关于java垃圾回收的小结

    我们每次创建对象都需要在栈上开辟空间,堆上使用内存,如果我们只是开辟了这个空间,而不去释放他,那么再大的内存和空间也会有满的一天,所以我们在Java中引入了GC(垃圾回收机制) 可达性分析:以代码中的一些变量为起点,看哪些对象能被访问到,标记为可达,剩

    2024年02月16日
    浏览(11)
  • 关于yolov8的一些理解

    关于yolov8的一些理解

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本。是一款强大、灵活的目标检测和图像分割工具,它提供了最新的 SOTA 技术。 Github: yolov8 提供了一个全新的SOTA模型。基于缩放系数也提供了N/S/M/L/X不同尺度的模型,以满足不同部署平台和应用场景的

    2023年04月25日
    浏览(9)
  • 深入理解Web注解:解析常用注解及其应用场景

    Web(World Wide Web)是由英国物理学家蒂姆·伯纳斯-李于1989年发明的一个基于互联网的信息系统,也是互联网最为知名和常用的应用之一。它通过一种名为超文本传输协议(HTTP)的协议来传输数据,并且使用统一资源定位符(URL)来标识网络上的资源。 Web的基本组成部分包括

    2024年02月05日
    浏览(6)
  • 关于深度学习中Attention的一些简单理解

    关于深度学习中Attention的一些简单理解

    Attention 机制 Attention应用在了很多最流行的模型中,Transformer、BERT、GPT等等。 Attention就是计算一个加权平均 ;通过加权平均的权值来自计算每个隐藏层之间的相关度; 示例 Attention 机制 Attention应用在了很多最流行的模型中,Transformer、BERT、GPT等等。 Attention就是计算一个加权

    2024年02月08日
    浏览(8)
  • 关于路由器和DNS解析的一些新理解

    关于路由器和DNS解析的一些新理解

    其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的,也在一点一点的学习相关知识,每次解决一个问题,就让我对一些事情有新的思考。。 今天前台同事,的机器突然上不了网,,和领导一起去看了一波,首先ping了一下网关,,然后发现,可以ping通的,然后pin

    2024年02月12日
    浏览(11)
  • [Java]关于基本数据类型与引用类型赋值时的底层分析的小结(简述)

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17969159 出自【进步*于辰的博客】 目录 1、关于赋值 1.1 基本数据类型赋值 1.2 String类型赋值 2、关于String赋值 2.1 情形一 2.2 情形二 3、关于String与char[]的比较 4、不同类型引

    2024年01月17日
    浏览(11)
  • 关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解

    关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解

    在项目中,研究标定时,像素坐标与轴位置的关系时,需要用到关于坐标系的转换。在此也就是找到世界坐标系与像素坐标系的转换关系。想理清楚故做如下记录。 四坐标关系图如下: 图中: 世界坐标系(O W —X W Y W Z W ): 一个三维直角坐标系,以其为基准可以描述相机

    2024年02月09日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包