如何通过groovy扩展方法

news2024/10/6 10:33:18

最近一直使用jmeter做接口测试,虽然好用,但是每次解析结果都要写大量重复代码。然后想到groovy是可以在运行时动态增强jvm字节码的,比如Date中就有大量增强的方法,比如format,upto,downto......,既然groovy可以,jmeter又能运行groovy,所以就有了下面的内容

新建一个groovy脚本

def current= new Date()
println current.class
current.downto(Date.parse("yyyy-MM-dd","2023-02-01")) {
    println it
}

可以看到运行正常

那么groovy到底是怎么做到的呢?

借助idea强大的代码定位功能,找到了downto方法的位置

通过观察groovy模块的包,发现被扩展方法的类所在的包都有一模一样的结构

那么可能这就是groovy能够扩展方法的关键了,接下来就是验证了,考虑到编写好的脚本需要打包,而脚本有可能还有依赖,为了方便操作,这里新建一个gradle项目来验证,(也可以使用maven或ant)

新建一个空的gradle项目,结构如下;

// 依赖添加groovy
implementation 'org.codehaus.groovy:groovy-all:3.0.11'
// 示例用到的第三方依赖
implementation 'com.jayway.jsonpath:json-path:2.7.0'

为了方便后面编写的脚本在的时候将依赖包一起拷贝过去,build.gradle中添加一个拷贝任务

task copyAllDependencies(type: Copy) {
    from configurations.compileClasspath.fileCollection {!it.name.toLowerCase().contains("jmeter")&&!it.name.toLowerCase().contains("groovy")}
    into "${buildDir}/libs"
}
// 这里选择build任务需要依赖拷贝依赖的任务,这样每次build jar包的时候就会自动拷贝依赖了
build.dependsOn(copyAllDependencies)

这里贴上之前定位代码的详细信息,对比我们调用的代码

// current就是下面方法的第一个参数了,downto里的第一个参数对应下面方法的第二个参数,第二个参数闭包其实对应方法的第三个参数闭包
current.downto(Date.parse("yyyy-MM-dd","2023-02-01")) {
    println it
}

接下来开始仿写一个要扩展的方法,新建一个groovy脚本,这里使用的是groovy语法,其实跟上面的结构是一样的

// 因为jmeter目前做接口测试主要用到的报文格式就是json,所以这里就以jsonpath的处理为例
package com.aben.demo.exts

import com.jayway.jsonpath.Configuration
import com.jayway.jsonpath.JsonPath
import com.jayway.jsonpath.Option

class JsonPathExt {
    static jsonpath(String self){
        return JsonPath.using(Configuration.builder().options(Option.SUPPRESS_EXCEPTIONS).build()).parse(self);
    }
}

接下来在resources目录下创建/META-INF/groovy/org.codehaus.groovy.runtime.ExtensionModule文件

moduleName=MySelExt
moduleVersion=3.0.11
# 扩展成员方法
extensionClasses=com.aben.demo.exts.JsonPathExt
# 扩展静态方法
staticExtensionClasses=

到这里项目的结构如下图所示

将打包好的jar连同下面的依赖包一同拷贝到groovy的lib目录下,重新启动groovyconsole.bat

验证效果如下:

可以看到jsonpath方法已经扩展成功了

对比两种方式是不是上面的要简单多了

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

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

相关文章

用 NFTScan 的角度解析 Yuga labs NFT 项目系列

如果要说 NFT 影响力最大的公司是哪个?如果说是 Yuga Labs 应该我想大家应该都不会否认。一个创立一年多的 NFT 营销和开发公司,多次的并购以及行销操作都立下 NFT 界的标竿典范,尤其 BAYC NFT 系列取得巨大成功之后,该团队已成为…

DSP_定义一个大的全局数组_探索之路

前言 最近在做基于dsp平台的无通信接口系统辨识,辨识的时候会有很大的数据需要存到一个数组当中,而dsp如果定义一个很大的全局数组,编译会报错。 本文将探索如何解决这个报错以及全局数组的大小极限。 正文 首先,我们定义了一个…

数学库:Extreme Optimization Numerical 8.1.4 Crack

Extreme Optimization Numerical.NET 的极端优化数值库,更快地构建金融、工程和科学应用程序,具有置信度和预测带的非线性曲线拟合,用于 .NET的极端优化数值库是为 Microsoft .NET 框架构建的通用数学和统计类的集合。用于 .NET的极端优化数值…

将无风险资产与单个风险资产进行组合

目录 1. 基本概念 2. 将无风险资产与单个风险资产进行组合 3. 有效资产组合 1. 基本概念 无风险资产和风险资产。 我的理解:无风险资产利率完全可确定,风险资产的利率称为预期收益率,并且有标准差。 关于风险资产预期收益率和标准差的计…

NC65 自由报表发布为节点如何显示以及如何取消已发布的报表节点

NC65 自由报表发布为节点如何显示以及如何取消已发布的报表节点? 一、NC65 自由报表发布为节点如何显示? 答:需要在动态建模平台-权限管理-职责管理下的职责节点进行功能分配,如下图: 二、如何取消已发布的报表节…

Javac Spire.Presentation 之PPT文本图片内容提取

目录结构前言文档准备引入Maven依赖代码块提取结果验证ppt_demo.ppt 提取结果pptx_demo.pptx 提取结果前言 应公司需求,需实现以下功能 PPT文本内容的替换;PPT文本内容的提取;PPT中图片的提取存放; 此文章将使用Spire.Presenta…

Mal-PEG-SCM,Maleimide PEG SCM,双功能修饰性PEG

Mal-PEG-SCM,SCM-PEG-Maleimide,Maleimide PEG SCM,Maleimide PEG Succinimidyl Carboxymethyl Ester马来酰亚胺-聚乙二醇-琥珀酰亚胺羧甲基酯,马来酰亚胺PEG琥珀酰亚胺羧甲基酯Product specifications:1.CAS No&#…

DataGrip下载安装及使用教程(详细版)

一.安装教程 1.下载 官网下载:DataGrip: The Cross-Platform IDE for Databases && SQL by JetBrains 2.点击Download跳转到下载页面 3.下载最新版本的可以直接点击 Download 下载,下载其他版本的点击 Other versions 下载其他版本 4. 4.选择…

改变Linux文件权限、所属用户组、所有者知识总结

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Linux操作…

requestAnimationFrame详解-js性能优化

requestAnimationFrame 请求动画帧 它是一个浏览器的宏任务 requestAnimationFrame的用法与settimeout很相似,只是不需要设置时间间隔而已。requestAnimationFrame使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。它返回一个整数&#x…

快鲸SCRM打通工单系统,实现客户售前售后一体化管理

深度运营客户关系,做好客户售后服务,才符合企业的长远利益。然而大多数企业只注重售前售中,忽视了售后,导致客户售后服务现状不尽人意,主要体现在: 把客户问题抛到售后群后,便放任不管; 缺乏标…

自动驾驶感知——超声波技术

文章目录1. 超声波基本概念1.1 声波的频率与分类1.2 超声波的波速和波长1.3 超声波的指向性1.4 超声波的反射和折射1.5 超声波的衰减1.6 超声波产生的效应2. 超声波传感器原理及传感器分类2.1 超声波传感器原理2.2 压电式超声波传感器2.3 磁致伸缩式超声波传感器2.4 超声波传感…

MyBatis案例 | 使用映射配置文件实现CRUD操作——通过主键查询对应数据

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址:🔥JavaWeb Java入门篇: 🔥Java基础学习篇 Java进阶学习篇&…

关于Linux中断的相关查询

1.linux 内核 /proc/interrupts 在 /proc/interrupts 文件中记录了 Linux 内核的中断信息,我们可以通过命令查看 sudo cat /proc/interrupts 文件中以表格的形式列举出来所有的内核中断,其表头信息标注如下: 我们可以通过特定任务执行时…

计算机SCI论文一定要在指定的机构润色吗? - 易智编译EaseEditing

不一定要在指定的机构润色。 首先期刊要求润色,是非常正常的事情。国人投的中文论文,有的也会被要求润色。 更不要说国外的英文期刊了,咱们写的英文文章投过去,大部分都会被要求润色的。 为什么期刊总是要求润色语言呢&#xff…

Windows7操作系统安全(3)

实验简介 实验所属系列:网络安全实践 实验对象: 本科/专科信息安全专业 相关课程及专业:计算机基础,Linux基础 实验时数(学分):2学时 实验类别:实践实验类预备知识 Windows系列是目…

Oracle重建控制文件

利用trace文件重建控制文件 1、生成trace文件: SQL>alter database backup controlfile to trace;2、找到生成的trace文件: SQL>show parameter user_dump_destuser_dump_dest 文件对应的路径即为trace文件的路径 3、关闭数据库 SQL>shutdo…

VueJS 之模板引用

文章目录参考描述模板引用引用访问模板引用组件中的模板引用$nextTick()示例updated错误示范正确演示$nextTick()参考 项目描述搜索引擎Bing哔哩哔哩黑马程序员VueJS 官方文档模板引用 描述 项目描述Edge109.0.1518.70 (正式版本) (64 位)操作系统Windows 10 专业版vue/cli5.…

jvm相关,jvm内存溢出,内存占用过高,CPU占用率高原因分析,MAT内存镜像文件分析的使用----学习笔记

什么是内存泄漏? 什么是内存溢出 内存溢出: OutOfMemory 它是指程序在申请内存时,没有足够的内存空间供其使用,抛出 OutOfMemory 错误 内存泄露: Memory Leak 它是指程序运行后,没有释放所占用的内存空间,比如程序运行完后没有释…

数据库和SQL初探

数据库和SQL初探1. 什么是数据库2. 数据库的结构3. MySQL表定义相关操作4. MySQL体系结构和存储引擎1. 什么是数据库 将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合。用来管理数据库的计算机系统称为数据库管理系统(DatabaseManagementSyste…