在groovy中定义类和java中是一样的。类的方法可以是static,也可以是非static的。
groovy中的方法可以是public, protected, private,同时也支持java中的修饰符,比如synchronized。
在groovy中导入包或者导入类,语法和java是一样的。只不过在groovy中默认已经导入了下面的package:
1 |
java.lang |
2 |
java.io |
3 |
java.math |
4 |
java.net |
5 |
java.util |
6 |
groovy.lang |
7 |
groovy.util |
在groovy和java中不同的一点就是,groovy默认是public的。
每一个groovy类,在JVM层级,都是字节码形式的java code,所以在java代码中可以调用groovy中申明的方法,反之亦然。
你可以指定方法的参数和返回值,以便他们能够更好的和java代码相互调用。当然你也可以实现接口或者重载方法。但是需要你没有指定方法后者属性的类型的话,那么在JVM层级的字节码中,他们将会是 java.lang.Object 类型。
比如:
1 |
//Callee.groovy |
2 |
class Callee { |
3 |
void hello() { |
4 |
println "hello, world" |
5 |
} |
6 |
} |
1 |
//Caller.groovy |
2 |
c = new Callee() |
3 |
c.hello() |
下面给出了一个最简单的groovy脚本:
1 |
println "Nice cheese Gromit!" |
如果你是要groovyc来编译上面的代码的话,假设你这个脚本的名字为Foo.script,那么你就会获得 Foo.class文件。
你可以在命令行运行下面的代码,假设你的classpath中包含:groovy.jar and asm.jar.
1 |
java Foo |
这将执行自动生成的实例化Foo class的 main(String[] args)方法,然后调用run()方法。当然你可以可以直接在java中使用这个类,
1 |
import groovy.lang.Binding; |
2 |
import groovy.lang.Script; |
3 |
4 |
public class UseFoo { |
5 |
public static void main(String[] args) { |
6 |
// lets pass in some variables |
7 |
Binding binding = new Binding(); |
8 |
binding.setVariable( "cheese" , "Cheddar" ) |
9 |
binding.setVariable( "args" , args) |
10 |
11 |
Script foo = new Foo(binding); |
12 |
foo.run(); |
13 |
} |
14 |
} |
其实在上面这里没必要使用Binding,因为Foo 有一个无参的构造函数,尽管使用Binding 我们能够更加容易的传递参数。
相比起类来说,在groovy脚本中,变量不需要申明(def),在脚本中变量的引用将自动创建并放入Binding中。
在groovy脚本中,为了编写一个方法,没必要像java一样必须先定义一个类,
但是和传统的基于class的groovy而言,在类外定义函数需要使用def关键字。但是如果你需要一些比如static或者实例变量等等的东西的时候,最好写一个类。
下面给出了一个例子:
1 |
def foo(list, value) { |
2 |
println "Calling function foo() with param ${value}" |
3 |
list << value |
4 |
} |
5 |
6 |
x = [] |
7 |
foo(x, 1 ) |
8 |
foo(x, 2 ) |
9 |
assert x == [ 1 , 2 ] |
10 |
11 |
println "Creating list ${x}" |