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可以使集合类、数组或基本类型等等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值