為了能即時修改程式不需要做到編譯,故透過Java來執行Groovy腳本來滿足此需求。
以下範例為將"A123456789,獅哥哥,18"轉換成java的Person物件,其中解析基本資料的程式碼使用Groovy腳本撰寫。
1.Maven加入Groovy類
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>2.5.6</version>
</dependency>
2.撰寫一隻java工具類可執行Groovy程式
public class GroovyScriptUtil {
/**
* 執行Groovy程式
* @param pData 傳入的資料
* @param pScript Groovy腳本
*/
public Person executeScript(String pData, String pScript) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
Person person = null;
try {
engine.eval(pScript);
Invocable invocable = (Invocable) engine;
// 傳入的參數
Object[] params = {pData};
// 執行Groovy(go為欲執行的方法名稱)
person = (Person) invocable.invokeFunction("go", params);
} catch (Exception e) {
throw new Exception(e);
}
return person;
}
}
3.撰寫一個domain物件,當作Groovy的回傳結果
package com.liongogo.domain;
public class Person {
private String id;
private String name;
private int age;
//以下省略get set方法
}
4.Groovy腳本(此範例視保存於D目錄下的txt檔案中)
import com.liongogo.domain.Person;
/**
data傳入資料,內容為
A123456789,獅哥哥,18
*/
def go(data) {
println '傳入資料:'+data;
/*拆解資料*/
String[] d = data.split(',');
/*根據戶役政資料生成Person物件*/
Person person = new Person();
person.setId(d[0]);
person.setName(d[1]);
person.setAge(Integer.parseInt(d[2]));
return person;
};
5.呼叫Util程式並傳入需要的資料
// 載入Groovy腳本
String groovyScript = "";
try {
File file = new File("D:\\GroovyScript.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
groovyScript = groovyScript + line;
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 執行Groovy腳本
try {
GroovyScriptUtil groovyScriptUtil = new GroovyScriptUtilgroovyScriptUtil();
Person person = groovyScriptUtil.executeScript("A123456789,獅哥哥,18", groovyScript);
} catch (Exception e) {
e.printStackTrace();
}