在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
java中String類常用方法、屬性等
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,你必須理解構造器。因為構造器可以提供許多特殊的方法,這個對於初學者經常混淆。但是,構造器和方法又有很多重要的區別。 下面將簡單介紹一下 ,最後用一個表作了些簡單的總結。 功能和作用的不同
java中String的常用方法
大寫 緩沖 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 與腳本語言結合呢,在
Java中wait和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