Java中运行Groovy,有三种比较常用的类支持
- GroovyShell
- 通常用来运行"script片段"或者一些零散的表达式(Expression)
- GroovyClassLoader
- 如果脚本是一个完整的文件,特别是有API类型的时候,比如有类似于JAVA的接口,面向对象设计时,通常使用GroovyClassLoader.
- ScriptEngine
- JSR-223应该是推荐的一种使用策略.规范化,而且简便.
ScriptEngine
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>2.1.6</version>
</dependency>
public static void evalScript() throws Exception{
ScriptEngineManager factory = new ScriptEngineManager();
//每次生成一个engine实例
ScriptEngine engine = factory.getEngineByName("groovy");
System.out.println(engine.toString());
assert engine != null;
//javax.script.Bindings
Bindings binding = engine.createBindings();
binding.put("date", new Date());
//如果script文本来自文件,请首先获取文件内容
engine.eval("def getTime(){return date.getTime();}",binding);
engine.eval("def sayHello(name,age){return 'Hello,I am ' + name + ',age' + age;}");
Long time = (Long)((Invocable)engine).invokeFunction("getTime", null);
System.out.println(time);
String message = (String)((Invocable)engine).invokeFunction("sayHello", "zhangsan",new Integer(12));
System.out.println(message);
}
- 实际案例,Java调用groovy文件里面的方法,并传递参数
static void simpleTest() throws IOException, InstantiationException, IllegalAccessException, ResourceException, ScriptException{
String[] roots = new String[] { "src/main/groovy/com/mobile263/billing/groovy/" };
//通过指定的roots来初始化GroovyScriptEngine
GroovyScriptEngine gse = new GroovyScriptEngine(roots);
GroovyObject groovyObject = (GroovyObject) gse.loadScriptByName("TestScript.groovy").newInstance();
String result = (String) groovyObject.invokeMethod("output", "hello");
System.out.println(result);
}
class TestScript {
static String output(def str){
println str;
return "hello"+str;
}
}
传送门
Groovy入门
Groovy入门
与java的异同
与java的异同
Java嵌入Groovy
Java嵌入Groovy
数据库
import groovy.sql.Sql;
import org.h2.tools.Server;
def db = Sql.newInstance('jdbc:mysql://10.200.1.6:3306/test', 'root', 'aaaaaa', 'com.mysql.jdbc.Driver');
db.execute(''' CREATE TABLE leike(mac varchar(20) NOT NULL PRIMARY KEY)''');
def macs = new File('shroute_inst.csv').readLines()
//重复的mac地址个数: 也就是这么多地址更换了平台.
macs.each{
db.execute('INSERT INTO t1(c) values(?)', [it]);
}
网友评论