1. 程式人生 > >在java中執行 groovy script 方法

在java中執行 groovy script 方法

如何在java中使用groovyshell來執行sript , 例如:

GroovyShell shell = new GroovyShell();
Script scrpt = shell.parse("script.groovy");

Binding binding = new Binding();
binding.setVariable("str1", "value1");
binding.setVariable("str2", "value2");             

scrpt.setBinding(binding);
System.out.println(scrpt.evaluate("customConcat(str1, str2)")); 
System.out.println(scrpt.evaluate("str1.concat(str2)"));


script.groovy:

def customConcat(def str1, def str2) {
str1.concat(str2)
}

正常執行System.out.println(scrpt.evaluate("str1.concat(str2)"));
執行System.out.println(scrpt.evaluate("customConcat(str1, str2)"))出現異常:
groovy.lang.MissingMethodException: No signature of method: Script1.customConcat() is applicable for argument types: (java.lang.String, java.lang.String) values: [value1, value2]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:78)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
at Script1.run(Script1.groovy:1)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518)

我們用groovyClassLoader來載入卻可以執行:

GroovyClassLoader loader = new GroovyClassLoader();
Class groovyClass = loader.parseClass(new File("C:/Users/Cagri/Desktop/IntergisGroovyScript.groovy"));

GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object res = groovyObject.invokeMethod("customConcat", new Object[]{"value1", "value2"});

這種呼叫evaluate()執行指令碼方法行不通是因沒有腳本里定義的方法沒有繫結,因此可以把script繫結給binding,然後執行的binding的引用方法:
Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
Script scrpt = shell.parse("script.groovy");

binding.setVariable("str1", "value1");
binding.setVariable("str2", "value2");
binding.setVariable("newConcat", scrpt);

System.out.println(scrpt.evaluate("newConcat.customConcat(str1, str2)"));
System.out.println(scrpt.evaluate("str1.concat(str2)"));
或者使用:
System.out.println(scrpt.invokeMethod("customConcat", new String[]{"value1","value2"}));



相關推薦

java執行 groovy script 方法

如何在java中使用groovyshell來執行sript , 例如: GroovyShell shell = new GroovyShell(); Script scrpt = shell.parse("script.groovy"); Binding binding

Java執行Groovy指令碼

        最近專案有個需求,需要執行一個方法,方法的目的是輸入一個金額XXX,根據抹零方式算出抹零後的金額,但是有個問題,困難場景:上游又獲取不到抹零的方式;下游又獲取不到XXX這個金額;這個時候需要寫一個Groovy指令碼,他有一個入參變數XXX,為抹零前的金額,我

java執行緒同步的幾種方法

方法一: 使用synchronized關鍵字  由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會

JAVA執行緒同步的方法(7種)彙總

同步的方法: 一、同步方法   即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態

java執行緒睡眠sleep()方法介紹

1、方法介紹    sleep(long millis)  執行緒睡眠 millis 毫秒    sleep(long millis, int nanos)  執行緒睡眠 millis 毫秒 + nanos 納秒2、如何呼叫sleep    因為sleep()是靜態方法,所以

java執行緒阻塞之sleep、suspend、join、wait、resume、notify方法解析(一)

java執行緒的5狀態包括create、runnable、running、blocked、dead。 create是指用new執行緒被建立,但是還沒有準備好各種資源。 runnable是指使用start啟動執行緒,這時候系統會為執行緒分配除cpu以外的所有需要的資源。 ru

java有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法 stop()和suspend()方法為何不推薦使用?

java5以前,有兩種實現方法,分別使用new Thread()和new Thread(runnable)形式,第一種繼承Thread類,直接呼叫thread的run方法,所以,我們往往使用Thread子類,即new SubThread()。第二種是實現Runn

java有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

java5以前,有如下兩種: 第一種: new Thread(){}.start();這表示呼叫Thread子類物件的run方法,new Thread(){}表示一個Thread的匿名子類的例項物件,子類加上run方法後的程式碼如下: new Thread(){ publi

java執行js代碼

engine byname manage gin 執行 腳本 post get 對象 //#1、用scriptEngineManger ScriptEngineManager engine=new ScriptEngineManager(); //#2

javaString類常用方法、屬性等

col clas equal ack length ++ ava eal rgs package Head18; public class java09 { public static void main(String[] args) { St

Java的泛型方法

pan sta 有一個 println 泛型方法 判斷 調用方法 user instant 這是一個轉載的博客 這是一個轉載的博客 這是一個轉載的博客   泛型是什麽意思在這就不多說了,而Java中泛型類的定義也比較簡單,例如:public class Test<T&

JAVA構造器和方法的區別點

string dem pub 關鍵字 意義 ext 沒有 ron 開始 要學習Java,你必須理解構造器。因為構造器可以提供許多特殊的方法,這個對於初學者經常混淆。但是,構造器和方法又有很多重要的區別。 下面將簡單介紹一下 ,最後用一個表作了些簡單的總結。 功能和作用的不同

javaString的常用方法

大寫 緩沖 let 常用方法 類型 http 全部 new 出現 轉自http://www.cnblogs.com/crazyac/articles/2012791.html java中String的常用方法1、length() 字符串的長度  例:char chars[]

Java調用JavaScript方法

兩個 tint work object c ash 沒有 .net nashorn alc 我們都知道腳本語言非常靈活,在處理某些問題的時候 Java 實現用十幾行來寫,用 js 可能不到十行就寫完,並且非常簡潔,那麽有沒有一種優雅的方式將 Java 與腳本語言結合呢,在

Javawait和sleep方法的區別

lee join 告訴 inter art 過程 lam 兩個 一次 1、兩者的區別 這兩個方法來自不同的類分別是Thread和Object 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法(鎖代碼塊和方法鎖)。 w

java sendredirect()和forward()方法的區別

rect 次數 報錯 nec 重定向 web服務 單獨 exception aca 一.文章1 HttpServletResponse.sendRedirect與RequestDispatcher.forward方法都可以實現獲取相應URL資源。 sendRedirect

Linux執行 .sh 的方法

比較 文件 mage 可執行 bash 關鍵字 fin 結束 進入 linux下執行.sh文件的方法 .sh文件就是文本文件,如果要執行,需要使用chmod a+x xxx.sh來給可執行權限。 是bash腳本麽 可以用touch test.sh #創建te

利用Jexl實現數據庫的計算公式在Java執行

bject urn arp key cal object num regex ply public class JexlEngineUtils { public static BigDecimal evaluateExpression ( Map <

Java類的構造方法

擴展 這樣的 實例化 構造函數 中文 編譯器 new對象 const 一個 constructor;構造函數。 在創建對象的時候,對象成員可以由構造函數方法進行初始化。 new對象時,都是用構造方法進行實例化的; 例如;Test test = new Test("a")

Java建立執行緒的方法

轉載自:https://www.cnblogs.com/3s540/p/7172146.html   Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runn