Groovy嵌入到JAVA里面执行有一种方式在通过使用GroovyClassLoader将Groovy的类动态地载入到Java程序中并直接使用或运行它.解析生成groovy脚本,GroovyClassLoader是GROOVY自带的类加载器,继承JAVA的URLClassLoader,其实质就是将GROOVY脚本变成class,这个过程会消耗CPU和内存,同时由于GROOVY在加载每个脚本的时候,都在脚本前面增加了的代码,导致对任何一次脚本解析都产生一个新的脚本,这样反应在页面上就是相当于每刷新一次,就会产生一批新的脚本,当做性能测试,压上很多用户的时候,就会导致大量的脚本对象产生,从而导致了OLD存在大量的groovy script脚本,最终引起频繁的GC(每4分钟一次)。解决的方式是在程序里面采用一个全局的MAP,对于同样的groovy 的script脚本,只调用一次,然后将生成的script对象存放在map中,这样来避免每个脚本每次调用都产生新的script对象。
下面解析方法内部代码:
return parseClass(text, "script" + System.currentTimeMillis() +
Math.abs(text.hashCode()) + ".groovy");
下面是实现四则运算的例子:
ClassLoader parent = this.getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Map<Integer,BigDecimal> values = new HashMap<Integer,BigDecimal>(); //需要计算的值
values.put(0,new BigDecimal(100));
values.put(1,new BigDecimal(200));
String express = "param.get(0)+param.get(1)"; //动态生成的表达式可以是加减乘除
StringBuffer classStr = new StringBuffer(); //groovy脚本
classStr.append("\npublic class GroovyHelp").append("{")
.append("\n\tpublic java.math.BigDecimal excute(")
.append("def param").append("){").append("\n\t\treturn " + express + ";");
.append("\n\t}").append("\n}");
Class groovyClass = loader.parseClass(classStr.toString()); //解析脚本
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
BigDecimal result = (BigDecimal) groovyObject.invokeMethod("excute", values); //excute为类中的方法名,values可以使集合类、数组或基本类型等等
分享到:
相关推荐
脚本解析工具,可使用Groovy或Xquery解析JSON报文或XML报文
Aviator是一个高性能、轻量级的Java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。它的设计目标是轻量级和高性能,相比于Groovy、JRuby等语言,Aviator非常小,即使加上依赖包也只有450K,不加依赖包更...
**表达式解析器(MVEL)** MVEL是一个强大的动态脚本语言,主要设计用于简化表达式的解析和执行。它在Java应用中广泛使用,提供了一种简洁的方式来处理数据操作和逻辑控制,尤其适用于配置和脚本场景。MVEL的语法接近...
在Groovy中,数据搜索功能和正则表达式是两个非常重要的工具,尤其在处理文本和数据解析时。在这篇关于“Groovy入门”的第四讲中,我们将深入探讨这两个主题。 ### 1. 数据搜索功能 在Groovy中,数据搜索通常涉及...
2. **Groovy 表达式解析**: 第二个例子展示了如何使用`GroovyShell`解析和执行Groovy表达式。`GroovyShell`提供了运行Groovy代码的能力,包括表达式和脚本。 - `CompilerConfiguration`:首先,创建了一个配置...
- **命令行工具**:Groovy提供了一系列命令行工具,如`groovy`命令,用于执行Groovy脚本、评估表达式、处理输入流等。 - **脚本编辑与执行**:通过`groovy-i`命令可以对文本文件进行行内编辑,并保存原始文件的备份...
3. 数据处理:Groovy可以方便地处理XML、JSON等数据格式,常用于数据转换和解析。 4. 测试:Spock测试框架使用Groovy编写,提供了富有表达力的测试语句,简化了测试代码的编写。 5. 容器管理:在Apache Kafka、...
博客中的作者可能还会讨论如何结合其他Groovy工具,如GPath表达式(用于更方便地查询XML)和Closure(用于定义可重用的代码块),以实现更复杂的XML处理任务。此外,可能还会提到如何在大型项目中使用Groovy来提高...
- **表达式与语句**:Groovy中的表达式和语句与Java类似,但更加灵活。例如,Groovy允许在if/else语句中直接返回表达式的值。 **2. 控制结构** - **条件语句**:Groovy支持if/else、switch/case等传统控制结构,...
这些表达式可以是Groovy的任何合法代码,使得模板具有强大的动态性。然而,原生的SimpleTemplateEngine在处理复杂模板或大量数据时可能会存在性能问题,因为它没有优化编译和执行的过程。 为了改进...
Groovy源代码通常包括语法解析器、编译器、类加载器、标准库以及各种工具和框架的实现。通过阅读和分析这些源码,我们可以深入了解Groovy的内部工作原理,如何将Groovy脚本转化为字节码,以及如何与Java平台交互。 ...
MVEL表达式的语法类似于JavaScript和Groovy,允许开发者在单行字符串中编写复杂的逻辑。例如,可以使用MVEL来评估数学表达式、条件语句、循环结构以及访问和修改对象的属性。这使得MVEL成为模板引擎、配置文件或动态...
这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是Spring框架的一个模块,旨在简化Spring应用的初始搭建以及开发过程。它提供了一种快速构建可运行的应用程序的方式,内置了...
### OGNL表达式在Struts中的应用解析 #### 一、OGNL表达式简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,主要用于获取和设置Java对象的属性,尤其适用于处理复杂的对象图。它最初由...
预编译的`Pattern`可以被多次使用而无需每次都解析正则表达式。 5. **正则表达式语法** Groovy遵循Java的正则表达式语法,包括元字符(如`.`代表任意字符,`\d`代表数字,`\w`代表字母数字字符等)、量词(如`*`...
`imgparser`可能是图片解析或处理的实现,Groovy可以方便地调用Java的图像处理库,如Java Advanced Imaging (JAI) 或者 ImageIO,来实现复杂的图像操作。此外,Groovy的动态性也允许开发者快速实验和迭代处理逻辑,...
例如,GroovyShell类允许动态执行Groovy脚本或解析脚本文件,如下所示: ```groovy GroovyShell shell = new GroovyShell(); shell.setVariable("context", "111"); shell.evaluate("C:\\test.groovy"); ``` 或者...
"groovy-xml-2.2.0-beta-1.zip" 文件是Groovy的一个版本,专注于XML处理功能,特别适用于在Groovy中解析、操作和生成XML文档。这个版本为2.2.0的beta-1,意味着它是该版本系列中的早期测试版,开发者可能在其中寻找...