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)