1. 程式人生 > >Java整合groovy之GroovyShell、GroovyScriptEngine、GroovyClassLoader

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