【Javassist】快速入门系列13 使用Javassist获取注解

news2024/10/6 8:40:13

系列文章目录

01 在方法体的开头或结尾插入代码
02 使用Javassist实现方法执行时间统计
03 使用Javassist实现方法异常处理
04 使用Javassist更改整个方法体
05 当有指定方法调用时替换方法调用的内容
06 当有构造方法调用时替换方法调用的内容
07 当检测到字段被访问时使用语句块替换访问
08 当检测到对象(不包括数组)创建时用代码块替换
09 当检测到对象(不包括数组)创建时用代码块替换
10 当检测到instanceof表达式时用代码块替换
11 当检测到显示类型转换时用代码块替换
12 当检测到catch语句时在catch前插入代码
13 使用Javassist获取注解


文章目录

  • 系列文章目录
  • 前言
  • 引入Javassist jar包
    • 使用Javassist获取注解
  • 总结


前言

上一章我们介绍了当检测到catch语句时在catch前插入代码,学习了 method.instrument的用法。以及参数为Handler的重载方法edit的含义。本章主要介绍使用Javassist获取注解。


引入Javassist jar包

在上几篇文章已经引入了javassist的jar包,如果你是第一次观看本系列文章,也可以复制以下maven依赖将jar包导入工程。

        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.28.0-GA</version>
        </dependency>

使用Javassist获取注解

/**
 * 【Javassist】快速入门系列13 当检测到显示类型转换时用代码块替换
 * 公众号&B站:精致的王同学
 * @author 精致的王同学
 * @date 2023/1/1 0:51
 */
public class Basic13Annotation {
    public static void main(String[] args) throws Exception{
        // 获取javassist默认类池
        ClassPool pool = ClassPool.getDefault();
        // 获取basic.Basic13Test的ctClass对象
        CtClass ctClass = pool.get("basic.Basic13Test");
        // 获取其doService方法
        CtMethod method = ctClass.getDeclaredMethod("doService");
        // 获取其basic.annotations.Validator注解
        Validator annotation = (Validator)method.getAnnotation(Validator.class);
        //  method.getAnnotations()方法获取指定方法上全的注解数组
        Object[] annotations = method.getAnnotations();
        Validator annotation1 = (Validator)annotations[0];
        System.out.println("annotation:"+annotation.name());
        System.out.println("annotation1:"+annotation1.name());
    }
}

以上Basic13Annotation 类创建了一个main方法,该方法中首先获取javassist的类池pool,然后调用pool.get(“basic.Basic13Test”)方法获取到basic包下的Basic13Test类。Basic13Test类源码如下:

/**
 * 第12节测试类
 * 公众号&B站:精致的王同学
 * @author 精致的王同学
 * @date 2022/12/28 17:54
 */
public class Basic13Test {
    @Validator(name = "ageValidator")
    public void doService(HashMap<String,Object> paramsMap) {
        //参数校验...
        // 业务代码
        System.out.println("doservice");
    }
}

该类中有一个doService方法,在屏幕上输出doservice。

回到Basic13Annotation的main方法,在获取到Basic13Test类的ctClass的对象之后,获取其doService方法的方法对象。

接着调用method.getAnnotation(Validator.class)方法获取方法上的Validator类型的注解。然后调用method.getAnnotations()方法获取指定方法上全的注解数组。获取数组的第一个元素。

由于doService方法上只有Validator一个注解。所以method.getAnnotations()获取的注解数组只有一个元素就是Validator注解。

该注解源码如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Validator {
    String name();
}

该注解有一个属性name,Basic13Annotation 中在获取到注解后分别打印注解的属性值。
Basic13Annotation的main方法结果如下:
main方法结果

总结

本篇文章介绍了如何使用Javassist获取注解。是除了反射获取注解外的另一种方式。

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

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

相关文章

MySQL性能优化三 一条SQL在MySQL中执行的过程

一 MySQL的内部组件结构 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 1.1 service层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学…

Easy-Captcha验证码 生成以及校验(简单易懂)

目录说明pom引入详解参数类使用easy-captcha 中提供了下面几种类源码说明Captcha使用验证图解源码测试GitHub说明 Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目 pom引入 <dependency><groupId>com.github.whvc…

【C++】 bitset(位图)的使用

目录 一、bitset的基本介绍 1. 位图的概念 2. 位图的应用 二、biset的基本使用 1. bitset的成员函数 2. 基本使用介绍 1. 定义方式 2. 成员函数的使用 一、bitset的基本介绍 1. 位图的概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数…

win系统一台电脑安装两个不同版本的mysql教程

1.mysql下载zip包&#xff08;地址&#xff09;MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压在你的电脑上&#xff08;不要再C盘和带中文的路径&#xff09; data和my.ini是没有的。 3.创建my.ini文件 创建记事本改变后缀名就可以 …

【5G RRC】小区搜索(Cell Search)和系统捕获(System Acquisition)流程

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

环境变量?拿来把你!

文章目录环境变量直接运行程序的第一种方法&#xff1a;把程序移动到系统目录底下echo $环境变量&#xff1a;查看环境变量PATH:指定命令的搜索路径export 定义一个新的环境变量export PATH旧路径&#xff1a;新路径getenv&#xff1a;获取环境变量—获取环境变量的第一种方式s…

车载诊断协议UDS——读写服务Service 22/2E

在UDS协议中,对于服务常用有两种格式: 1、Service (服务) + Subfunction( 子服务) 子服务可理解为对服务的功能补充,比如会话模式Service 10服务,子服务可以分为不同的会话模式(默认会话模式、扩展会话模式、编程会话模式等等),用来区分服务的执行权限。 2、Servi…

[OC学习笔记]启动流程(objc部分)

先回顾下这张图&#xff0c;回顾下整体流程。现在分析下在此流程中objc4源码&#xff08;818.2&#xff09;的处理逻辑。 _objc_init解析 我们在上图可以看出&#xff0c;dyld在main函数之前&#xff08;pre-main&#xff09;会间接调用到objc的_objc_init&#xff0c;其中使…

洛谷—— AT_abc157_a [ABC157A] Duplex Printing

文章目录[ABC157A] Duplex Printing题面翻译题目描述输入格式输出格式说明提示题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2样例 #3样例输入 #3样例输出 #3提示制約Sample Explanation 1AC代码[ABC157A] Duplex Printing 题面翻译 题…

GC调优

GC调优一、新生代调优二、幸存区调优三、老年代调优四、GC调优案例案例一&#xff1a;Full GC和Minor GC频繁案例二&#xff1a;请求高峰期发生Full GC&#xff0c;单次暂停时间特别长&#xff08;CMS&#xff09;案例三&#xff1a;老年代充裕情况下&#xff0c;发生Full GC&a…

SQL中灵活的视图

文章目录视图的创建、嵌套及特性创建视图查询视图视图的嵌套常见的8个使用场景场景一&#xff1a;仅提供需要的数据场景二&#xff1a;对特定的用户仅开放特定的数据&#xff0c;达到保护敏感数据的目的&#xff0c;提升了数据安全性&#xff1b;仅筛选需要的数据场景四&#x…

迭代器模式 实现ES大量数据查询

目录 项目需求 要求 普通策略 升级策略&#xff1a;使用迭代器模式 迭代器模式组成 代码实现 查询实体 返回实体 实现类 代码测试 mock的ES返回结果json数据 第一次返回结果 第二次返回结果 第三次返回结果 postMan请求, 控制台打印结果 项目需求 数据从Mysq…

云计算服务安全指南

声明 本文是学习GB-T 31167-2014 信息安全技术 云计算服务安全指南. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 云计算服务安全退出服务 9.1退出要求 合同到期或其他原因都可能导致客户退出云计算服务&#xff0c;或将数据和业务系统迁…

植物大战僵尸:代码实现自动收集阳光

通过阳光增加的值为切入点&#xff0c;找到自动收集阳光的关键判断并实现自动收集阳光&#xff0c;首先我们猜测当阳光出现后&#xff0c;我们是否会去点击&#xff0c;这个过程必然是由一个判断和一个时钟周期事件来控制的&#xff0c;那么当我们点击下落的阳光以后&#xff0…

DC-UNet:重新思考UNet架构和双通道高效CNN医学图像

摘要 经典UNet的体系架构在某些方面存在着局限性。因此本文对其结构提出了改进。1)设计高效的CNN架构来取代编码器和解码器;2)在最先进的U-Net模型的基础上&#xff0c;应用残差模块来取代编码器和解码器之间的跳过连接来进行改进。 医学图像分割是通过一些自动和半自动的方法…

linux系统中块设备的基本实现方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中的块设备的实现方法。 目录 第一&#xff1a;块设备基本简介 第二&#xff1a;块设备驱动框架 第三&#xff1a;实现程序代码实现 第一&#xff1a;块设备基本简介 块设备驱动与字符设备驱动之间的主…

双指针:环形链表II

题目&#xff1a;142. 环形链表 II 我们知道&#xff0c;判断一个链表是否为环是这样的&#xff1a; public boolean hasCycle(ListNode head) {ListNode slow head,quickly head;while(quickly ! null && quickly.next ! null){slow slow.next;quickly quickly.n…

【javaSE】中异常如何处理

目录 文章目录 一、异常的初识 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 二、异常的处理和抛出 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.4异常的处理流程 三、自定义异常类 3.1举例&#xff1a;实现一个用户登录功能 一、异常的初识 1.1异常的概念 在…

Perl语法

Perl从许多语言中借用了语法和概念&#xff1a;awk&#xff0c;sed&#xff0c;C&#xff0c;Bourne Shell&#xff0c;Smalltalk&#xff0c;Lisp甚至是英语。每个简单的语句必须以分号&#xff08;;&#xff09;结尾&#xff0c;和Java类似&#xff0c;与Python不同。 一、扩…

【苹果推群发iMessage推】软件安装它起首将消息发送到Apple Push服务器,而后Apple Push服务器将消息发送到装配了应用程序的手机

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…