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 );

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM