代碼生成利器:IDEA 強(qiáng)大的 Live Templates

前言

Java 開發(fā)過程經(jīng)常需要編寫有固定格式的代碼,例如說聲明一個(gè)私有變量钞翔,logger或者bean等等黑忱。對于這種小范圍的代碼生成,我們可以利用 IDEA 提供的 Live Templates功能袄膏。剛開始覺得它只是一個(gè)簡單的Code Snippet践图,后來發(fā)現(xiàn)它支持變量函數(shù)配置,可以支持很復(fù)雜的代碼生成沉馆。下面我來介紹一下Live Templates的用法码党。

基本使用

IDEA 自帶很多常用的動(dòng)態(tài)模板,在 Java 代碼中輸入fori斥黑,回車就會(huì)出現(xiàn)

for (int i = 0; i < ; i++) {

}
image.png

Tab可以在各個(gè)空白處跳轉(zhuǎn)揖盘,手動(dòng)填值。

自定義 Template

官方自帶模板畢竟不能滿足我們個(gè)人編碼風(fēng)格的需要锌奴,Live Templates提供了變量函數(shù)的方式供我們自定義兽狭。

簡單用法

新增自定義模板,首先需要填寫觸發(fā)單詞(即 Abbreviation)缨叫,描述是可選的椭符,然后定義模板的上下文,點(diǎn)擊define選擇Java耻姥,這樣在編輯 Java 的時(shí)候就會(huì)觸發(fā)當(dāng)前模板销钝,定義完上下文之后,就可以填寫模板了琐簇。

image.png

下面列舉幾個(gè)我常用的簡單模板

==========
<out>
----------
System.out.println($END$)
==========
<pfs>
----------
private final static String $varName$  = "$var$";`
==========
<privateField>
----------
/**
 * $COMMENT$
 */
@Getter
@Setter
private $TYPE$ $NAME$;
==========
<main>
----------
public static void main(String[] args) {
     $END$
}
==========

模板支持變量的定義蒸健,使用$$包圍的字符表示一個(gè)變量座享。$END$是一個(gè)特殊的預(yù)定義變量,表示光標(biāo)最后跳轉(zhuǎn)的位置似忧。每個(gè)變量的位置都可以跳轉(zhuǎn)過去渣叛。

高級用法

如果你用過 vim 的Code Sinppet插件,你會(huì)發(fā)現(xiàn)模板里面是可以執(zhí)行函數(shù)的盯捌,強(qiáng)大的 Live Templates當(dāng)然也支持淳衙,而且 IDEA 能夠感知代碼的語義,例如說當(dāng)前編輯的函數(shù)的參數(shù)饺著。但這一點(diǎn)就能夠讓我們玩出花來箫攀。我們從易到難來研究模板函數(shù)的功能。

image.png

前面我們提到的變量可以綁定函數(shù)幼衰,配置方式如上圖所示靴跛。

快速聲明變量

聲明變量是一個(gè)常用的操作,特別是需要聲明變量需要加注解渡嚣,注釋的時(shí)候梢睛,這些代碼寫起來就很枯燥。下面是我定義的模板:

<osgiRef>
----------
/**
 * $END$
 */
@OsgiReference
@Setter
private $TYPE$ $NAME$;

乍一看這個(gè)模板跟我上面定義的privateField差不多识椰,唯一的不同在于我給這些變量綁定了函數(shù)绝葡。

  1. clipboard():返回當(dāng)前粘貼板的字符串
  2. decapitalize():將輸入的字符串首字母變?yōu)樾?/li>

下面我們演示一下,我們先拷貝當(dāng)前類名裤唠,然后輸入osgiRef

image.png

快速聲明 logger

聲明 logger 也是一個(gè)常用的操作挤牛,上面我們是利用了粘貼函數(shù)來快速聲明變量,現(xiàn)在我們來利用另一個(gè)函數(shù)className()种蘸,顧名思義墓赴,它的作用就是返回當(dāng)前類名。

<logger>
----------
/** logger */
private static final Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);
image.png

最強(qiáng)大的 groovyScript()

如果說上面用到的函數(shù)提供的能力有限航瞭,不夠靈活诫硕,那么groovyScript()提供了一切你想要的能力,它支持執(zhí)行 Groovy 腳本處理輸入刊侯,然后輸出處理后的字符串章办。

groovyScript("code", ...)

|  code   |   一段Groovy代碼或者Groovy腳本代碼絕對路徑    |
|  ...    |   可選入?yún)ⅲ@些參數(shù)會(huì)綁定到`_1, _2, _3, ..._n`, 在 Groovy 代碼中使用滨彻。|

下面我們來看一下它的實(shí)際應(yīng)用藕届。

快速 bean 配置

新增一個(gè)服務(wù)都要在 Spring 中注冊一個(gè) bean,一般這個(gè)配置無非就是將指明idclass亭饵,由于我們是在 xml 中配置休偶,所以不能利用className()函數(shù),但是我們可以利用clipboard()函數(shù)獲取到類的全引用辜羊,在 IDEA 中我們直接右鍵類名踏兜,點(diǎn)擊Copy Reference就行词顾。然后執(zhí)行 groovy 腳本獲取類名。

<bean>
----------
<bean id="$id$" class="$REF$" />

id綁定decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard()))碱妆,首先取clipboard()的值得到類的全引用肉盹,然后執(zhí)行 groovy 代碼_1.tokenize('.')[-1](按.分割為字符串?dāng)?shù)組,然后取最后一個(gè)即可得到類名疹尾,然后用decapitalize()將首字母小寫即可得到id上忍。

image.png

快速打印當(dāng)前上下文信息

打印錯(cuò)誤日志的時(shí)候需要打印當(dāng)前上下文信息的,例如說入?yún)⒛杀荆袝r(shí)候入?yún)⒑芏嗟臅r(shí)候睡雇,寫起來很痛苦,好在有模板函數(shù)methodParameters()饮醇,返回當(dāng)前函數(shù)參數(shù)的列表,當(dāng)然這個(gè)列表我們不能直接使用秕豫,需要結(jié)合groovyScript對它進(jìn)行轉(zhuǎn)化朴艰。

<printContext>
---------------
LogUtil.$TYPE$(LOGGER, "$MSG$ " + $params$);

params綁定到groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters()),就能夠自動(dòng)將當(dāng)前函數(shù)的參數(shù)格式化后輸出混移。

image.png

總結(jié)

上面我們簡單介紹了常用的模板函數(shù)祠墅,其實(shí) IDEA 還有很多其它模板函數(shù),具體參考Creating and Editing Template Variables歌径。IDEA 是一個(gè)很強(qiáng)大的工具毁嗦,善用工具能夠極大的提高工作效率,將精力投入到關(guān)鍵的事情上回铛,而不是將時(shí)間浪費(fèi)在編寫重復(fù)代碼上面狗准。一些更高級的用法還有待大家去發(fā)掘。最后推廣一波我寫的代碼生成插件CodeMaker茵肃,好好利用也能節(jié)省很多重復(fù)編寫代碼的時(shí)間腔长。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市验残,隨后出現(xiàn)的幾起案子捞附,更是在濱河造成了極大的恐慌,老刑警劉巖您没,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟召,死亡現(xiàn)場離奇詭異,居然都是意外死亡氨鹏,警方通過查閱死者的電腦和手機(jī)欧募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喻犁,“玉大人槽片,你說我怎么就攤上這事何缓。” “怎么了还栓?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵碌廓,是天一觀的道長。 經(jīng)常有香客問我剩盒,道長谷婆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任辽聊,我火速辦了婚禮纪挎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跟匆。我一直安慰自己异袄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布玛臂。 她就那樣靜靜地躺著烤蜕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迹冤。 梳的紋絲不亂的頭發(fā)上讽营,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音泡徙,去河邊找鬼橱鹏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堪藐,可吹牛的內(nèi)容都是我干的莉兰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼礁竞,長吁一口氣:“原來是場噩夢啊……” “哼贮勃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苏章,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寂嘉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枫绅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泉孩,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年并淋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寓搬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡县耽,死狀恐怖句喷,靈堂內(nèi)的尸體忽然破棺而出镣典,到底是詐尸還是另有隱情,我是刑警寧澤唾琼,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布的猛,位于F島的核電站艺智,受9級特大地震影響信峻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祭饭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一芜茵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倡蝙,春花似錦九串、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至析既,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谆奥,已是汗流浹背眼坏。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酸些,地道東北人宰译。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像魄懂,于是被迫代替她去往敵國和親沿侈。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359