• Java集成groovy之GroovyShell、GroovyScriptEngine、GroovyClassLoader


    • 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 );
    
        }
    
    }
  • 相关阅读:
    [转]C#中抽象类和接口的区别
    [转]OO设计原则总结
    [转]MVC3快速搭建Web应用(三)实例篇
    原生内存(堆外内存)
    使用SAX解析XML实例根据属性查找
    Cannot forward after response has been committed问题解决及分析
    dubbo服务化实施整理
    bean:write 标签不能显示出 换行符的解决方案
    Dubbo原理解析监控
    thread之1:java与线程
  • 原文地址:https://www.cnblogs.com/jsersudo/p/10178407.html
Copyright © 2020-2023  润新知