- GroovyClassLoader
用 Groovy 的 GroovyClassLoader ,动态地加载一个脚本并执行它的行为。GroovyClassLoader是一个定制的类装载器,
负责解释加载Java类中用到的Groovy类。
- GroovyShell
GroovyShell允许在Java类中(甚至Groovy类)求任意Groovy表达式的值。您可使用Binding对象输入参数给表达式,
并最终通过GroovyShell返回Groovy表达式的计算结果。
- GroovyScriptEngine
GroovyShell多用于推求对立的脚本或表达式,如果换成相互关联的多个脚本,使用GroovyScriptEngine会更好些。
GroovyScriptEngine从您指定的位置(文件系统,URL,数据库,等等)加载Groovy脚本,并且随着脚本变化而重新加载它们。
如同GroovyShell一样,GroovyScriptEngine也允许您传入参数值,并能返回脚本的值。
- CycleDemo.groovy:
/** * Created by Jxy on 2018/12/25 14:45 */ def cycle(def number){ for(i in 0..<number){ println i } }
- java文件:
import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import groovy.lang.GroovyShell; import groovy.lang.Script; import groovy.util.GroovyScriptEngine; import groovy.util.ResourceException; import groovy.util.ScriptException; import java.io.File; import java.io.IOException; /** * Created by Jxy on 2018/12/24 11:28 * 测试GroovyShell、GroovyClassLoader、GroovyScriptEngine 性能 */ public class GroovyIntoJavaDemo1 { //测试次数 private static final int num = 10000; public static void main(String[] args) throws IOException, ResourceException, ScriptException { /* GroovyClassLoader */ long start = System.currentTimeMillis(); GroovyClassLoader loader = new GroovyClassLoader(); Class aClass = loader.parseClass(new File("src/Groovy/com/baosight/groovy/CycleDemo.groovy")); try { GroovyObject instance = (GroovyObject) aClass.newInstance(); instance.invokeMethod("cycle",num); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } long end = System.currentTimeMillis()-start; /* GroovyShell */ long start1 = System.currentTimeMillis(); new GroovyShell().parse( new File( "src/Groovy/com/baosight/groovy/CycleDemo.groovy" ) ) .invokeMethod("cycle",num); long end1 = System.currentTimeMillis()-start1; /* GroovyScriptEngine */ long start2 = System.currentTimeMillis(); Class script = new GroovyScriptEngine("src/Groovy/com/baosight/groovy/") .loadScriptByName("CycleDemo.groovy"); try { Script instance =(Script) script.newInstance(); instance.invokeMethod ("cycle",new Object[]{num}); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } long end2 = System.currentTimeMillis()-start2; System.out.println(" GroovyClassLoader时间:"+ end ); System.out.println(" GroovyShell时间:"+ end1 ); System.out.println(" GroovyScriptEngine时间:"+ end2 ); } }