Groovy 是基于 JVM 的 动态脚本语言,可以与 Java 无缝对接。Groovy 并不替代 Java,而是与 Java 互补
下载地址: http://www.groovy-lang.org/download.html 并将 groovy/bin 配置到环境变量中
创建 hello.groovy
println 'Hello world'
执行
$ groovy hello.groovy
Hello world
java.lang.String
)和插值字符串(groovy.lang.GString
)。
// 普通字符串 def a = "world" // 或使用单引号 'world' // 插值字符串 def b = "Hello $a" // 必须双引号 // 三单引号保持缩进格式 def c = '''\ tab 0 tab 1 tab 2 ''' // 声明字符的三种方法 char c1 = 'A' def c2 = 'B' as char def c3 = (char) 'C'
// 以下两个方法等价 def method1(a) { 'hello ' + a } public String method2(int a) { return 'hello ' + a }
..
操作符来定义一个区间对象。
def range1 = 0..5 // = def range = [0, 1, 2, 3, 4, 5] def range2 = 0..<5 // = def range = [0, 1, 2, 3, 4] def range3 = 'a'..'d' // 支持字符类型 ['a', 'b', 'c', 'd']
groovy.util.Eval
类是最简单的用来在运行时动态执行 Groovy 代码的类,提供了几个静态工厂方法供使用,内部其实就是对GroovyShell的封装。
public class GroovyTest { public static void main() { // 执行 Groovy groovy.util.Eval.me("println 'hello world'"); // 绑定自定义参数 Object result = Eval.me("age", 22, "if(age < 18){'未成年'}else{'成年'}"); // = 成年 // 绑定一个名为 x 的参数的简单计算 Eval.x(4, "2*x"); // = 8 //带有三个绑定参数(x、y 和 z)的简单计算 Eval.xyz(4, 5, 6, "x*y+z"); // = 26 } }
groovy.lang.GroovyShell
除了可以执行 Groovy 代码外,提供了更丰富的功能,比如可以绑定更多的变量,从文件系统、网络加载代码等。
GroovyShell shell = new GroovyShell(); //可以绑定更多变量 shell.setVariable("age",22); //直接求值 shell.evaluate("if(age < 18){'未成年'}else{'成年'}"); //解析为脚本,延迟执行或者缓存起来 Script script = shell.parse("if(age < 18){'未成年'}else{'成年'}"); assertEquals(script.run(), "成年"); //可以从更多位置加载/执行脚本 //shell.evaluate(new File("script.groovy")); //shell.evaluate(new URI("http://wwww.a.com/script.groovy"));
groovy.lang.GroovyClassLoader
是一个定制的类加载器,可以在运行时加载 Groovy 代码,生成 Class 对象。
GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); String scriptText = "class Hello { void hello() { println 'hello' } }"; // 将Groovy脚本解析为Class对象 Class clazz = groovyClassLoader.parseClass(scriptText); // Class clazz = groovyClassLoader.parseClass(new File("script.groovy")); assertEquals(clazz.getName(),"Hello"); clazz.getMethod("hello").invoke(clazz.newInstance());
groovy.util.GroovyScriptEngine
能够处理任何 Groovy 代码的动态编译与加载,可以从统一的位置加载脚本,并且能够监听脚本的变化,当脚本发生变化时会重新加载。
//script/groovy/hello.groovy println "hello $name" GroovyScriptEngine scriptEngine = new GroovyScriptEngine("script/groovy"); Binding binding = new Binding(); binding.setVariable("name", "groovy"); while (true){ scriptEngine.run("hello.groovy", binding); TimeUnit.SECONDS.sleep(1); } //输出 hello groovy hello groovy .... //将hello.groovy内代码修改为println "hi $name", GroovyScriptEngine会重新进行加载 hi groovy hi groovy
ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy"); Bindings bindings = new SimpleBindings(); bindings.put("age", 22); Object value = engine.eval("if(age < 18){'未成年'}else{'成年'}",bindings); assertEquals(value,"成年"); //script/groovy/hello.groovy //println "hello world" engine.eval(new FileReader("script/groovy/hello.groovy")); //hello world