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

news2024/11/17 20:21:03

目录

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加载的过程了。

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

重点是,如果想在编译期间处理注解相关的逻辑,需要集成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是我们日常开发用的最多的,配合反射机制可以在很多场景优化代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3中文|好莱坞新星如何成就电影业?

Web3 技术已经被用于电影行业&#xff0c;以建立社区并将利基内容代币化。NFT 将是好莱坞的下一个新星。 【利基&#xff08;niche&#xff09;是指针对企业的优势细分出来的市场&#xff0c;这个市场不大&#xff0c;而且没有得到令人满意的服务。产品推进这个市场&#xff0c…

DATAFAKER 使用方法记录

DATAFAKER 使用方法记录 win10 64位 Python 3.10.11 参考网址 datafaker的使用–详细教程 https://blog.csdn.net/A15517340610/article/details/105623103 https://github.com/gangly/datafaker python 版本 It is compatible with python2.7 and python3.4 也就是说 他…

开箱即用的ChatGPT替代模型,还可训练自己数据

一、普遍关注是什么&#xff1f; OpenAI 是第一个在该领域取得重大进展的公司&#xff0c;并且使围绕其服务构建抽象变得更加容易。然而&#xff0c;便利性带来了集中化、通过中介的成本、数据隐私和版权问题。 而数据主权和治理是这些新的LLM服务提供商如何处理商业秘密或敏…

Vue(数据绑定、el和data多种写法、理解MVVM、数据代理)

一、数据绑定 1. vue中有两种数据绑定&#xff08;通过开发者工具进行查看&#xff09; 1. 单项绑定&#xff08;v-bind&#xff09;数据只能从data流向页面 在输入框中中输入vue实例中的数据没有变化 2. 双向绑定&#xff08;v-model&#xff09;数据能从data流向页面&#x…

【Java 数据结构】二叉树的遍历 (递归和非递归实现)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

大数据分析查询_Impala介绍_对HDFS_Hbase直接查询_速度快_组成架构_执行原理---大数据之Impala工作笔记0001

官网的地址:Impala (apache.org)https://impala.apache.org/ https://impala.apache.org/ 官网的地址: 首先我们看一下什么是impala,可以看到Impala是cloudera公司,也就是做Hadoop付费版的公司, 提供的,基于Hive的,因为他跟hive共用元数据,meta,他可以提供对HDFS,Hbase的SQL…

好家伙,阿里新产Java性能优化(终极版),涵盖性能优化所有操作

上月公司来了一位大佬&#xff0c;入职不到一周就把公司现有项目的性能优化了一遍&#xff0c;直接给公司节省了一半的成本。 一问情况&#xff0c;才知道这位仁兄也是一路被虐过来的。去年年底被裁&#xff0c;本以为自己技术还行&#xff0c;看了一段时间面经&#xff0c;复…

dB 、dBSPL、dBFS、dBTP

本文整理自&#xff1a;https://corychu.medium.com/%E9%8C%84%E9%9F%B3%E7%AD%86%E8%A8%98-%E6%95%B8%E4%BD%8D%E9%9F%B3%E9%87%8F%E6%A8%99%E6%BA%96-dbfs-dbtp-lufs-c47ca4646b7f 概述&#xff1a;dBFS&#xff08;相对于满刻度的分贝&#xff09;是数字系统中振幅水平的测…

8. 优先队列

8. 优先队列 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在某些情况下&#xff0c;我们可能需要找出队列中的最大值或者最小值&#xff0c;例如使用一个队列保存计算机的任务&#xff0c;一般情况下计算机的任务都是有优先级…

element select改成成tree树状下拉

<template><el-select class"jhx-formData-inputRow" ref"configSelect" v-model"orgName" filterable placeholder"请选择":filter-method"filterMethod" clear><el-option :label"orgValue.label&quo…

Redis7中的持久化技术RDB和AOF的详细解释说明

文章目录 前置知识持久化原理RDB持久化RDB优化配置项RDB文件格式RDB持久化过程RDB总结 AOF持久化AOF的工作流程AOF中的rewirte机制rewrite AOF文件格式查看AOF文件 AOF优化配置项 AOFRDB混用纯缓存模式对比和技术选型建议 前置知识 官网关于持久化的说明 Redis 是一个内存数据…

频域抽取FFT(DIF-FFT)的C语言实现

原理 此处以基2频域抽取FFT为例&#xff0c;讲述频域抽取FFT的原理。假设FFT的长度为 N 2 m N2^m N2m&#xff0c;我们将序列 x x x的FFT变换分为以下两个部分&#xff1a; X ( k ) ∑ n 0 N / 2 − 1 x ( n ) W N n k ∑ n N / 2 N − 1 x ( n ) W N n k X(k)\sum_{n0}…

SQL Server存储过程(数据库引擎)使用详解

存储过程&#xff08;数据库引擎&#xff09; 一、背景知识1.1、使用存储过程的好处1.2、存储过程的类型 二、创建存储过程三、修改存储过程四、删除存储过程五、执行存储过程5.1、建议5.2、使用 Transact-SQL执行存储过程 六、授予对存储过程的权限6.1、授予对存储过程的权限6…

院士联合指导+超强专家阵容+丰厚奖金机会,第十二届“麒麟杯”大赛报名正式开启!

当前&#xff0c;开放、协作、共享的开源模式已成为全球软件技术和产业创新的主导&#xff0c;也为信息技术国产自主化提供了强大助力。高校师生作为国产开源建设的主要技术群体之一&#xff0c;是国产开源未来发展的中坚力量。 2023年第十二届“麒麟杯”全国开源应用软件开发…

强制变成Android的形状,iPhone这波更新严重违背祖训

众所周知&#xff0c;苹果每年要开两次发布会。 秋季发布会的主角是新 iPhone &#xff0c;而6月的 WWDC 全球开发者大会则会以软件为主。 WWDC 2023 将于6月5日举行&#xff0c;iOS 17、macOS 14 及新版本 tvOS、WatchOS 都将发布。 同时新的混合现实设备所搭载的 xrOS 也有…

创建Windows 11恢复U盘的两种方法

我们在使用电脑的过程中&#xff0c;无法预知未来会出现什么问题。当您遇到一些严重的系统问题时&#xff0c;您可能需要从故障的计算机中恢复。不幸的是&#xff0c;对于大多数用户来说&#xff0c;这意味着从头开始&#xff0c;因为他们没有提前创建恢复媒体。 虽然Windows 1…

每日学术速递4.20

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Avatars Grow Legs: Generating Smooth Human Motion from Sparse Tracking Inputs with Diffusion Model(CVPR 2023) 标题&#xff1a;化身长腿&#xff1a;使用扩散模型从稀疏跟踪…

知识蒸馏之自蒸馏【附代码】

知识蒸馏的核心思想就是将大模型的知识传给小模型。 这里的知识通常就是模型所学的数据分布。大模型特点一般是具有非常高的精度&#xff0c;但可能在速度上不行&#xff0c;或者是不易部署&#xff0c;小模型通常是易部署&#xff0c;速度快但精度不如大模型。 因此可以将大…

【程序员面试金典】面试题 02.07. 链表相交

【程序员面试金典】面试题 02.07. 链表相交 题目描述解题思路 题目描述 描述&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#…

使用Storm proxies动态代理IP浅析影响在线代理IP质量的因素?

影响在线代理IP质量的因素有很多&#xff0c;主要包括以下几个方面&#xff1a; 服务器稳定性&#xff1a;在线代理IP的稳定性和可用性与其所在的服务器质量密切相关。如果服务器配置低、网络不稳定、带宽不足等因素&#xff0c;都可能导致在线代理IP的质量下降。IP地址的稳定性…