在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}" |