GroovyShell 介绍 GroovyShell 是 Groovy 中的一个强大工具类,允许在运行时动态执行 Groovy 脚本。这对于需要在应用程序中执行动态代码或脚本的场景尤其有用。 GroovyShell 实践 示例 1:基本用法 import groovy.lang.GroovyShell def shell = new GroovyShell() def result = shell.evaluate GroovyShell 允许我们通过传递变量来动态控制脚本行为。 GroovyShell 执行多行代码的能力。 此外,GroovyShell 还可以处理数据计算和分析任务,以简洁的脚本实现强大的数据处理功能。以下总结了 GroovyShell 的几个核心应用场景。
Groovy 类中调用 Groovy 脚本 1、参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2、创建 Binding 对象并设置 args 参数 3、创建 GroovyShell 在类方法中调用 Groovy 脚本 ; 在 evaluate 方法中 , 首先创建 GroovyShell 实例对象 , 然后执行该实例对象的 evaluate 方法 , 传入要调用的 Groovy shell = new GroovyShell(getClass().getClassLoader(), binding); return shell.evaluate(file); } } 2、创建 Binding 对象并设置 args 参数 此处创建 GroovyShell 实例对象 涉及到传入 Binding 类型的参数 , 这个参数是 绑定作用域 变量 参数 ; 在 对象并执行 Groovy 脚本 首先 , 创建 GroovyShell 对象 , 在构造函数中 , 需要传入 Binding 对象 ; GroovyShell shell = new GroovyShell
GroovyShell groovyShell = new GroovyShell(); //装载解析脚本代码 Script script = groovyShell.parse GroovyShell groovyShell = new GroovyShell(); //装载解析脚本代码 Script script = groovyShell.parse GroovyShell groovyShell = new GroovyShell(); //装载解析脚本代码 Script script = groovyShell.parse groovyShell = new GroovyShell(groovyBinding); Script script = groovyShell.parse(templateScript) 导致OOM的原因并不止GroovyShell、Script等实例过多,经过查阅资料得知,如果脚本中的Java代码也创建了对象或者new了实例,即使销毁了GroovyShell也不会销毁脚本中的对象。
脚本 ---- 1、参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 可以参考 groovy.lang.Script 类的 evaluate 方法 , 通过 GroovyShell 在类方法中调用 Groovy 脚本 ; 在 evaluate 方法中 , 首先创建 GroovyShell 实例对象 , 然后执行该实例对象的 evaluate 方法 , 传入要调用的 Groovy */ public Object evaluate(File file) throws CompilationFailedException, IOException { GroovyShell shell = new GroovyShell(getClass().getClassLoader(), binding); return shell.evaluate(file); } } 2、创建 Binding 对象并设置 args 参数 此处创建 GroovyShell 实例对象 涉及到传入 Binding 类型的参数 , 这个参数是 绑定作用域 变量 参数 ; 在
在Java代码中,我们可以通过创建GroovyShell实例来执行Groovy代码。 [] args) { GroovyShell shell = new GroovyShell(); String script = "println 'Hello, Groovy { public static void main(String[] args) { GroovyShell shell = new GroovyShell(); try BindingBinding类是GroovyShell的一个关键组件,它提供了变量绑定和上下文环境。 通过Binding,我们可以在GroovyShell中定义变量,以及在Groovy代码中访问这些变量。
文章目录 一、Groovy 类中调用 Groovy 脚本 1、创建 GroovyShell 对象并执行 Groovy 脚本 2、代码示例 二、完整代码示例 1、调用者 Groovy 脚本的类 2、被调用者 Groovy 脚本 3、执行结果 一、Groovy 类中调用 Groovy 脚本 ---- 1、创建 GroovyShell 对象并执行 Groovy 脚本 首先 , 创建 GroovyShell 对象 , 在构造函数中 , 需要传入 Binding 对象 ; def shell = new GroovyShell(getClass().getClassLoader(), binding) 然后 , 设置要调用的 Groovy 脚本对应的 File 文件对象 ; def file = new File("Script.groovy") 最后 , 调用 GroovyShell 对象的 evaluate binding.setVariable("args", ["arg0", "arg1"]) // 执行 Groovy 脚本 def shell = new GroovyShell
在Java代码中,我们可以通过创建GroovyShell实例来执行Groovy代码。 String[] args) { GroovyShell shell = new GroovyShell(); String script = "println 'Hello GroovyScriptRunner { public static void main(String[] args) { GroovyShell shell = new GroovyShell Binding Binding类是GroovyShell的一个关键组件,它提供了变量绑定和上下文环境。 通过Binding,我们可以在GroovyShell中定义变量,以及在Groovy代码中访问这些变量。
groovyShell = new GroovyShell(groovyBinding); String scriptContent = "import pers.doublebin.example.groovy.script.service.TestService 预设对象 在上一节中提到,groovy支持通过GroovyShell预设对象,在groovy动态脚本中直接调用预设对象的方法。 groovyShell = new GroovyShell(groovyBinding); String scriptContent = "def query = testService.testQuery (2L);\n" + "query"; Script script = groovyShell.parse(scriptContent); 对象,在提供的execute接口实现中用GroovyShell对象生成Script脚本对象,并调用Script的run()方法运行动态脚本并返回结果。
298) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) at groovy.lang.GroovyShell.parseClass (GroovyShell.java:688) at groovy.lang.GroovyShell.parse(GroovyShell.java:700) at groovy.lang.GroovyShell.evaluate (GroovyShell.java:584) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:623) at groovy.lang.GroovyShell.evaluate (GroovyShell.java:594) at org.springframework.scripting.groovy.GroovyScriptEvaluator.evaluate(GroovyScriptEvaluator.java
<init>(GroovyCodeSource.java:108) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:470) at JavaClass.startScript Groovy 脚本 , 需要使用 “src/main/groovy/Script.groovy” 路径 ; import groovy.lang.Binding; import groovy.lang.GroovyShell binding.setVariable("args", new String[]{"arg0", "arg1"}); // 执行 Groovy 脚本 GroovyShell shell = new GroovyShell(JavaClass.class.getClassLoader(), binding); File file = new File("src
被调用者 Groovy 脚本 3、执行结果 一、绑定作用域 binding 变量分析 ---- 分析 groovy.lang.Script 类的 evaluate 方法源码 , 在该方法中 , 创建了一个 GroovyShell 对象 ; 在创建时 , 将本脚本的 Binding binding 成员传递给了该 GroovyShell 对象 ; Binding binding 成员中 , 保存了所有的 绑定作用域 变量 ; GroovyShell */ public Object evaluate(File file) throws CompilationFailedException, IOException { GroovyShell shell = new GroovyShell(getClass().getClassLoader(), binding); return shell.evaluate(file);
groovy-all</artifactId><version>2.4.3</version></dependency> 构造代码如下: packagecom.al1ex;importgroovy.lang.GroovyShell + e.message;} };runCalculator()";shell.evaluate(script);}} 执行效果如下: 运行方式 Java代码中常用的运行groovy方式有如下几种: GroovyShell 基本介绍 GroovyShell是Groovy提供的一个强大工具,它可以用于动态执行Groovy代码片段,我们通过GroovyShell我们可以轻松地在Java程序中执行Groovy脚本并且能够与Java (groovy.lang)evaluate:627,GroovyShell(groovy.lang)evaluate:598,GroovyShell(groovy.lang)main:9,GroovyShellExample ,而部分场景中还涉及本地加载和远程加载两种方式,下面我们介绍本地加载方式: 加载方式1: 执行的Groovy脚本从本地加载执行: packagecom.al1ex;importgroovy.lang.GroovyShell
示例代码-基于Java的Groovy应用程序javaCopy codeimport groovy.lang.GroovyShell;public class GroovyApplication { public static void main(String[] args) { // 创建一个GroovyShell对象 GroovyShell shell = new GroovyShell \n" + "println hello"; // 在GroovyShell中执行脚本 shell.evaluate(script 它使用GroovyShell类来执行Groovy脚本。在脚本中,我们定义了一个变量hello并打印出它的值。
Java集成 Java 调用 Groovy Eval groovy.util.Eval 类是最简单的用来在运行时动态执行 Groovy 代码的类,提供了几个静态工厂方法供使用,内部其实就是对GroovyShell Eval.x(4, "2*x"); // = 8 //带有三个绑定参数(x、y 和 z)的简单计算 Eval.xyz(4, 5, 6, "x*y+z"); // = 26 } } GroovyShell groovy.lang.GroovyShell 除了可以执行 Groovy 代码外,提供了更丰富的功能,比如可以绑定更多的变量,从文件系统、网络加载代码等。 GroovyShell shell = new GroovyShell(); //可以绑定更多变量 shell.setVariable("age",22); //直接求值 shell.evaluate(
public static void main(String[] args) throws Exception { Binding binding = new Binding(); GroovyShell shell = new GroovyShell(binding); binding.setVariable("name", "bo"); binding.setVariable("age
indy</classifier> <version>2.4.5</version> </dependency> 最终定位到出现问题的代码如下,当你配置分表的表达式后,每次执行查询操作,都会创建一个 GroovyShell 在 GroovyShell 中,每次都会生成一个类加载器,来加载类 Script1,加载完后又无法被 GC 掉,导致内存泄露。 ).evaluate(Joiner.on("").join("{it -> \"", algorithmExpression, "\"}")); } 这里升级 sharding 新版本即可,新版本中 GroovyShell private static final GroovyShell SHELL = new GroovyShell(); ... } 这里还有个疑问,类加载器加载用完了并且状态是 dead 为什么不回收掉呢 HeapDumpOnOutOfMemoryError public static void main(String[] args) { for (int i = 0; i < 4000; i++) { new GroovyShell
实战代码示例在Java中调用Groovy脚本import groovy.lang.GroovyShell;import groovy.lang.Script;public class JavaCallsGroovy { public static void main(String[] args) { GroovyShell shell = new GroovyShell(); Script
*/ public Object evaluate(File file) throws CompilationFailedException, IOException { GroovyShell shell = new GroovyShell(getClass().getClassLoader(), binding); return shell.evaluate(file);
//1 a binding is used to share data between the script and the calling classdef shell = new GroovyShell (binding) //2 a GroovyShell can be used with this bindingbinding.setVariable('x',1) / binding.getVariable('z') == 5 //5 and the `z` variable has been "exported" into the bindingbinding可以用来共享数据GroovyShell //1config.scriptBaseClass = 'MyBaseClass' //2def shell = new GroovyShell //4 greet()"""定义一个CompilerConfiguration指定脚本类创建GroovyShell
交互命令行控制台 命令groovyConsole :启动图形交互控制台 命令groovysh :启动shell命令交互 你可以用下面的语句执行任何Groovy脚本: java groovy.lang.GroovyShell