`
mengqingyu
  • 浏览: 328588 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

GROOVY实现表达式解析

阅读更多
        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大量计算导致oom的解决办法

    解决办法:对计算的表达式expression进行预编译,以表达式作为key,将编译好的类进行缓存,这样只会首次计算时去编译,后面再次计算时,根据expression从缓存里面取到对象,然后进行计算,不会再去创建类。...

    java开源包7

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    QLExpress:QLExpress是用于Java平台的功能强大,轻量级,动态的语言,旨在提高开发人员在不同业务场景中的工作效率

    由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神...

    java开源包3

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包4

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包1

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包11

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包2

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包6

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包5

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包10

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包8

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包9

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包101

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    Java资源包01

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java开发常用jar包

    jasperreports-3.5.3-applet.jar jasperreports-3.5.3-javaflow.jar groovy-all-1.5.5.jar JasperReport报表 fckeditor-java-core-2.6.jar imageinfo-1.9.jar serializer.jar fckeditor在进行文字编辑时,使用的仍...

    widget-generator:该工件能够基于带注释的 POJO 生成小部件配置模型

    然后,解析器类能够解析 POJO 并使用它们生成配置模型。 暴露的注解如下: @Widget :这个注解应该用于实现WidgetStencil接口的类。 它包含有关小部件名称的信息,以及使用哪个 POJO 传达其配置信息。 有关如何...

Global site tag (gtag.js) - Google Analytics