Groovy學(xué)習(xí)(一)——腳本與類

腳本與類

Groovy代碼文件與class文件的對(duì)應(yīng)關(guān)系
作為基于JVM的語(yǔ)言,Groovy可以非常容易的和Java進(jìn)行互操作,但也需要編譯成class文件后才能運(yùn)行,所以了解Groovy代碼文件和class文件的對(duì)應(yīng)關(guān)系,有助于更好地理解Groovy的運(yùn)行方式和結(jié)構(gòu)。

對(duì)于沒(méi)有任何類定義

如果Groovy腳本文件里只有執(zhí)行代碼称龙,沒(méi)有定義任何類(class),則編譯器會(huì)生成一個(gè)Script的子類戳晌,類名和腳本文件的文件名一樣鲫尊,而腳本的代碼會(huì)被包含在一個(gè)名為run的方法中,同時(shí)還會(huì)生成一個(gè)main方法沦偎,作為整個(gè)腳本的入口疫向。

對(duì)于僅有一個(gè)類

如果Groovy腳本文件里僅含有一個(gè)類,而這個(gè)類的名字又和腳本文件的名字一致豪嚎,這種情況下就和Java是一樣的搔驼,即生成與所定義的類一致的class文件, Groovy類都會(huì)實(shí)現(xiàn)groovy.lang.GroovyObject接口。

對(duì)于多個(gè)類

如果Groovy腳本文件含有一個(gè)或多個(gè)類侈询,groovy編譯器會(huì)很樂(lè)意地為每個(gè)類生成一個(gè)對(duì)應(yīng)的class文件舌涨。如果想直接執(zhí)行這個(gè)腳本,則腳本里的第一個(gè)類必須有一個(gè)static的main方法扔字。

對(duì)于有定義類的腳本

如果Groovy腳本文件有執(zhí)行代碼, 并且有定義類, 那么所定義的類會(huì)生成對(duì)應(yīng)的class文件, 同時(shí), 腳本本身也會(huì)被編譯成一個(gè)Script的子類囊嘉,類名和腳本文件的文件名一樣

1. public static void main vs script

Groovy 同時(shí)支持腳本和類温技。以以下代碼為例:

Main.groovy

class Main {                                       
    static void main(String... args) {     
        println 'Groovy world!'                   
    }
}

定義類,名稱是Main
main方法用作類的主要方法 public static void main(String[])
方法的主體println 'Groovy world!'
這是典型的java代碼扭粱,其中代碼必須嵌入到一個(gè)類中方可執(zhí)行舵鳞。Groovy 使它更簡(jiǎn)潔:
Main.groovy
println 'Groovy world!'
腳本可以被視為類,無(wú)需聲明它琢蛤,但存在一些差異蜓堕。

2. 腳本轉(zhuǎn)換為類

腳本始終會(huì)被編譯為類。Groovy 編譯器將為你編譯該類虐块,并將腳本的正文復(fù)制到方法中俩滥。因此,前面的示例的編譯情況類似如下:
Main.groovy

import org.codehaus.groovy.runtime.InvokerHelper
class Main extends Script {                     
    def run() {                                 
        println 'Groovy world!'                 
    }
    static void main(String[] args) {           
        InvokerHelper.runScript(Main, args)     
    }
}

類繼承自 groovy.lang.Script
groovy.lang.Script需要一個(gè)帶返回值的方法run

image.png

腳本正文進(jìn)入方法run
該方法是自動(dòng)生成的main
并委托對(duì)方法執(zhí)行腳本run
如果腳本位于文件中贺奠,則該文件的基名用于確定生成的腳本類的名稱

3.方法

可以定義方法到腳本中,如下所示

int fib(int n) {
    n < 2 ? 1 : fib(n-1) + fib(n-2)
}
assert fib(10)==89s

您還可以混合方法和代碼错忱。生成的腳本類將所有方法都引入腳本類儡率,并將所有腳本體組合到方法中:

//腳本開(kāi)始
println 'Hello'                                 
//在腳本正文中定義方法
int power(int n) { 2**n }                       
//腳本繼續(xù)
println "2^6==${power(6)}"  

此代碼在內(nèi)部轉(zhuǎn)換為:

import org.codehaus.groovy.runtime.InvokerHelper
class Main extends Script {
    int power(int n) { 2** n}                   
    def run() {
        println 'Hello'                         
        println "2^6==${power(6)}"              
    }
    static void main(String[] args) {
        InvokerHelper.runScript(Main, args)
    }
}

4.變量

腳本中的變量不需要類型定義。這意味著此腳本:

int x = 1
int y = 2
assert x+y == 3

行為與以下行為相同:

x = 1
y = 2
assert x+y == 3

但是以清,兩者之間存在語(yǔ)義差異:

如果變量聲明為第一個(gè)示例中儿普,則它是局部變量。它將在編譯器生成的方法run中聲明掷倔,并且在腳本主體之外不可見(jiàn)眉孩。特別是此變量在腳本的其他方法中不可見(jiàn)

如果變量未聲明類型或def占位符勒葱,則進(jìn)入腳本綁定浪汪。綁定從方法中可見(jiàn),如果使用腳本與應(yīng)用程序交互凛虽,并且需要在腳本和應(yīng)用程序之間共享數(shù)據(jù)死遭,則綁定尤其重要。

如果希望變量成為類的字段而不進(jìn)入Binding 凯旋,可以使用@Field注釋呀潭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市至非,隨后出現(xiàn)的幾起案子钠署,更是在濱河造成了極大的恐慌,老刑警劉巖荒椭,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谐鼎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡戳杀,警方通過(guò)查閱死者的電腦和手機(jī)该面,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門夭苗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人隔缀,你說(shuō)我怎么就攤上這事题造。” “怎么了猾瘸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵界赔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我牵触,道長(zhǎng)淮悼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任揽思,我火速辦了婚禮袜腥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钉汗。我一直安慰自己羹令,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布损痰。 她就那樣靜靜地躺著福侈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卢未。 梳的紋絲不亂的頭發(fā)上肪凛,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音辽社,去河邊找鬼伟墙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爹袁,可吹牛的內(nèi)容都是我干的远荠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼失息,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼譬淳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起盹兢,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤邻梆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绎秒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浦妄,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剂娄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢涝。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阅懦,靈堂內(nèi)的尸體忽然破棺而出和二,到底是詐尸還是另有隱情,我是刑警寧澤耳胎,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布惯吕,位于F島的核電站,受9級(jí)特大地震影響怕午,放射性物質(zhì)發(fā)生泄漏废登。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一郁惜、第九天 我趴在偏房一處隱蔽的房頂上張望堡距。 院中可真熱鬧,春花似錦兆蕉、人聲如沸吏颖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疚俱,卻和暖如春劝术,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呆奕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工养晋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梁钾。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓绳泉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親姆泻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子零酪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355