java中执行groovy脚本

java脚本引擎Groovy实战 ​互联网时代随着业务的飞速发展,不仅产品迭代、更新的速度越来越快,个性化需求也是越来越多。如何快速的满足各种业务的个性化需求是我们要重点思考的问题。我们开发的系统如何才能做到热部署就能适应各种规则变化呢?实现业务和规则的解耦。 好了,Java的ScriptEngine脚本引擎给了我们一个选择,它支持代码动态执行,代码修改后不需要重启JVM进程,就可以使用解析或编译方式执行,非常方便,在一些动态业务规则、热更新、热修复等场景中会非常方便。 阅读详情

1、依赖

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>3.0.9</version>
    <type>pom</type>
</dependency>

2、工具类

package com.example.datacollector.support.groovy;

import cn.hutool.core.map.MapUtil;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * GroovyExecutorUtil
 *
 * @author ygr
 * @date 2021/11/29 23:29
 */
@Slf4j
public class GroovyExecutorUtil {

    private static final GroovyClassLoader CLASS_LOADER = new GroovyClassLoader();

    public static Object execute(String scriptText, String methodName, Map<String, Object> contextParams, Object... args)
            throws Exception {
        Class<?> groovyClass = CLASS_LOADER.parseClass(scriptText);
        GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
        if (MapUtil.isNotEmpty(contextParams)) {
            // 将map中的值设置为脚本属性,在脚本中可以直接调用
            contextParams.forEach(groovyObject::setProperty);
        }
        return groovyObject.invokeMethod(methodName, args);
    }
}

3、测试

public static void main(String[] args) throws Exception {

    String content = "import cn.hutool.core.util.StrUtil\n" +
        "\n" +
        "\n" +
        "def sayHello(name) {\n" +
        "    println date?.getTime()\n" +
        "    println(\"my name is $name\");\n" +
        "    def reverse = StrUtil.reverse(\"hello\")\n" +
        "    println reverse\n" +
        "    def list = []\n" +
        "    if(list) {\n" +
        "       println 'not empty'\n" +
        "    } else {\n" +
        "       println 'empty~'\n" +
        "    }\n" +
        "    def obj = [name:'jack',detail:[[roleName:'admin']]]\n" +
        "    def role = obj.detail?[0]?.roleName\n" +
        "    println role\n" +
        "    obj.age = 20\n" +
        "    println obj\n" +
        "    \"success\"\n" +
        "}";

    Map<String, Object> params = new HashMap<>();
    params.put("date", new Date());
    long start = System.currentTimeMillis();

    Object execute = GroovyExecutorUtil.execute(content, "sayHello", params, "ygr");
    System.out.println(System.currentTimeMillis() - start);

    System.out.println(execute);
    /*输出结果如下
    1638669552206
    my name is ygr
    olleh
    empty~
    admin
    [name:jack, detail:[[roleName:admin]], age:20]
    885
    success
    */
}

Java中Groovy脚本执行引发的MetaSpace内存泄露分析与解决方案 在Java应用开发中,动态脚本执行是扩展系统灵活性的常见需求,Groovy作为JVM上的动态语言,因其与Java的无缝集成和强大的动态能力被广泛应用于规则引擎、工作流和插件系统等场景。其核心原理是通过GroovyClassLoader动态编译脚本为Java类并加载到JVM的MetaSpace(元空间)中。然而,若ClassLoader生命周期管理不当,动态生成的类及其元数据将无法被垃圾回收,导致MetaSpace内存持续增长直至OOM,这就是典型的内存泄露问题。该问题的技术价值在于揭示了JVM类加载与卸载机 阅读详情

相关推荐

【低代码开发】Java中使用Groovy主要有三种常见的方法

Java集成Groovy的三种方法:1)GroovyShell适合执行简单脚本;2)GroovyClassLoader可动态加载Groovy类,类似反射调用;3)JSR-223 ScriptEngine是标准化方案,支持多语言集成。方法选择需权衡场景需求:简单计算用GroovyShell,插件式开发用GroovyClassLoader,多语言兼容选JSR-223。需添加Groovy依赖,复杂场景可组合使用。

meisongqing的博客 793

java代码中使用Groovy的三种方式详解

java代码中使用Groovy的三种方式详解

qq_36305027的博客 1万+

华中农业大学C++考试基础练习题

实验一 1 通过日期求某月的天数。 输入日期的年份和月份,求该月有多少天。提示:对于月份为1、3、5、7、8、10、12的月份天数为31,月份为4、6、9、11的月份天数为30,月份为2时要结合年份考虑闰年的情况。 输入描述 输入两个正整数y和m分别表示年份和月份。 输出描述 如果y和m满足条件:1900<=y<3000,0<m<13,输出该月的天数;否则输出“Input error!”。 输入样例 2010 12 输出样例 31 #include"iostream" using n

雨的博客 1万+

在java中调用Groovy

在java中调用Groovy

S_L__的博客 5147

SOC-ATF 安全启动BL2流程分析(2)

Bl2的启动流程与bl1类似,主要区别是bl2的初始化流程比bl1更简单,但其可能需要加载更多的镜像,如bl31、bl32和bl33。由于bl2可以运行于el3或s-el1,它们的入口函数和处理流程都有所区别,为了简化分析我们选取比较常见的s-el1方式,以下为其总体执行流程:上图仅供参考,实际看一下代码结构:上面截图展示了 链接汇编文件,bl2_el3.ld.S 是指bl2 运行于el3;bl2.ld.S 是实现bl2运行于s-el1 .

z20230508的博客 1389

SerDes硬件设计原理介绍

接收端:外部差分串行数据------线性均衡器----(CDR从数据中恢复出采样时钟)-----解串器(串行信号转并行信号)-------8B/10B的解码器或解扰器-----FIFO-----FPGA接受差分并行数据。发送端: FPGA发送差分并行数据----FIFO------8B/10B编码器或者扰码器-----串行器(并行信号转串行信号)-----均衡器(滤波)--------TX串行信号差分外发。串行器:8bit的并行数据----2bit的并行数据----1bits的串行数据。

weixin_42304393的博客 1110

Java执行groovy脚本的两种方式

https://www.cnblogs.com/dandelion200/p/14683609.html

思考、总结、专注 3840

PyMiMi实战指南:midas_api配置与连接测试详解

本文详细介绍了PyMiMi库中midas_api的配置与连接测试全流程。从环境准备、API密钥获取,到核心的url_cfg配置函数使用,再到通过test_url进行连接验证,提供了清晰的步骤和代码示例。文章重点解析了配置原理、常见错误排查方法(如401错误、连接超时),并强调了API密钥的安全性管理,帮助用户稳固建立Python与Midas Civil NX之间的自动化通信桥梁。

weixin_29044713的博客 707

java groovy脚本_Java中执行groovy脚本的方式

Java中执行groovy脚本的方式2020-10-16 07:36:01.0作为groovy类执行作为groovy类执行:加载groovy类之后,通过反射的方式实例化,并调用指定的方法,返回结果。实例如下private Object execGroovy(String groovyCode, String methodName, Object... params) {​try (GroovyCl...

weixin_36463292的博客 1186

王道考研操作系统笔记(第一章)附:王道考研408所有PPT和思维导图

学习感想 别人的笔记对你的学习基本上没有用处,容易培养人的惰性,如需ppt和思维导图请拉到最后,有github链接 记笔记并不是一件浪费时间的事情,还有利于多次学习 真心希望大家在学习的过程中记笔记 操作系统 第一章 计算机系统概述 1.1 操作系统 1.1.1 操作系统的概念和功能 概念 操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软

qq_41732756的博客 1万+

从Android到鸿蒙:UI框架迁移的实战指南与最佳实践

本文为Android开发者提供了将应用UI框架迁移至鸿蒙系统的实战指南。文章深入对比了Android命令式编程与鸿蒙ArkUI声明式编程的核心差异,详细讲解了从环境配置、布局迁移(如RecyclerView转List)、逻辑处理到多设备适配与性能优化的全流程最佳实践,帮助开发者高效完成迁移工作。

weixin_29208077的博客 434

用Java编写Groovy脚本,然后用命令行执行该脚本

主要介绍Groovy语言,如何再Groovy中写Java代码,如何配置系统利用cmd命令行执行Groovy脚本

weixin_41733225的博客 1755

STM32CubeIDE开发环境搭建与GPIO控制实战

嵌入式开发中,MCU开发环境构建是软硬件协同的起点,其核心在于工具链选型、外设抽象层级与调试可靠性。HAL库作为ST官方标准硬件抽象层,通过统一接口屏蔽芯片差异,显著提升工程可移植性;而STM32CubeIDE则以图形化配置+自动生成代码的方式,实现‘配置即代码’的确定性开发范式。该组合在教学验证、原型迭代和中小规模量产中具备高性价比技术价值,广泛应用于智能传感、工业HMI及IoT终端等场景。本文聚焦STM32CubeIDE 1.15.0环境部署、MyST账户与固件包管理、ST-LINK驱动校验,以及基于H

weixin_33531560的博客 81

java 运行 groovy_java测试框架如何执行groovy脚本文件

本人在写基于httpclient的测试框架时,用到了groovy脚本作为测试用例的脚本语言,自然就需要java执行上传的测试脚本,在看过实例之后,自己进行了封装,总体来说跟java反射执行java方法类似。但又有一些不兼容的情况,部分已经写了博客做记录了,以后会陆续更新。分享代码,供大家参考。其中一个比较大的区别时,在获取groovy类加载器的时候必须是非静态的。package com.fissi...

weixin_28713083的博客 388

数学与纳米技术:微观世界的数学描述

《数学与纳米技术:微观世界的数学描述》 关键词:纳米技术、数学模型、微观世界、物理现象、计算模拟 摘要:本文探讨了数学在纳米技术领域的应用,从数学基础回顾、纳米技术引论,到物理现象与

AI天才研究院 1532

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

详解Java执行groovy脚本的两种方式

Java// 初始化Bindings// 绑定参数// 定义groovy脚本中执行方法的名称// 定义groovy脚本内容" +" +" +"}";try {// 执行脚本// 获取执行结果try {// 初始化groovy脚本对象// 定义groovy脚本中执行方法的名称// 定义参数// 执行脚本并获取结果。

LuckFairyLuckBaby的博客 1555

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java执行Groovy脚本

public class printlntest { @Test public void test() { GroovyShell shell = new GroovyShell(); URL url = getClass().getClassLoader().getResource("println.groovy"); ...

jxluoix的专栏 295

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java执行Groovy脚本语言

Groovy是什么 Groovy是一个功能强大的、动态的基于JVM的脚本语言。强大在哪里,请看下图。更详细的请参考wiki。 Java中使用Groovy 首先要引入依赖 <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.5</versi.

zhuqiang12的博客 1088

java脚本引擎Groovy动态执行

1.2.3.4.5.

DN金猿的博客 545

在Android的运行时执行嵌入Java的Groovy脚本

从2.4版开始,groovy支持android。我想在我的Android应用程序中运行一个嵌入Java中的Groovy脚本。 本网站解释这是可能的:http://melix.github.io/blog/2014/06/grooid2.html 适应groovy语言的一个困难是, 尽管如此,groovy是一种高度动态的语言。它的能力之一是 在运行时执行脚本。如果我们想输入一个groovy 在设备上...

zjy764219923的专栏 613

Java中执行Groovy脚本

Groovy脚本执行

zhengchao1991的博客 4924

java groovyshell_Groovy执行脚本命令shell command

1): 直接执行一个字符串语句,executing a stringA string can be executed in the standard java way:def command = """executable arg1 arg2 arg3"""// Create the Stringdef proc = command.execute() // Cal...

weixin_33445134的博客 504

MooTool Java控制台:代码格式化与Groovy脚本执行的完整教程

MooTool是一款功能强大的开发者工具箱,为程序员提供了多种实用工具。其中,Java控制台功能是一个特别实用的模块,它集成了Java和Groovy代码的格式化与执行能力,让开发者能够快速测试代码片段、格式化代码并执行Groovy脚本。本文将详细介绍如何使用MooTool的Java控制台功能,帮助你提升开发效率。 ## 🚀 MooTool Java控制台功能概览 MooTool的Java控制

gitblog_01117的博客 379

如何使用groovy执行java脚本代码

前言: 1. 不阐述任何业务场景和作用,只提供食用说明书 2. 执行脚本会提升对系统的入侵度,还请谨慎使用,若用户自行加入产品业务逻辑中,与本博文无关,后果自负 1. 使用maven仓库引入相关sdk包 <!-- 动态代码执行 --> <dependency> <groupId>org.codehaus.groovy</...

Momeory的博客 1622

java 执行动态的脚本(groovy) 调用Springboot的Service方法

功能目的:通过在线编写代码,使其项目具备动态调整java中已定义好的Service的方法,通过组合相关代码,灵活完成相应功能。本示例,调用时,参数是对象,需要通用 import 对象。要与Service的参数对象类型保持一致。示例1:body参数 (groovy脚本)示例2:body参数(groovy脚本)1. 引入groovy jar包。3. 4.示例Service。3.定义示例Service。

hongbowu的专栏 889

java中使用groovy脚本执行

写了一个test方法: @Test public void engineTest() throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("groovy"); System.out.println("============"); if (engine == null)

weixin_39516640的博客 944
上一篇: centos7虚拟机搭建k8s集群
下一篇: java后端Excel导出工具
杨某人信了你的邪
博客等级 码龄9年 20粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值