代碼生成利器:IDEA 強大的 Live Templates - 文章 - 伯樂在線
http://blog.jobbole.com/110607/html
Java 開發過程常常須要編寫有固定格式的代碼,例如說聲明一個私有變量,logger
或者bean
等等。對於這種小範圍的代碼生成,咱們能夠利用 IDEA 提供的 Live Templates
功能。剛開始以爲它只是一個簡單的Code Snippet
,後來發現它支持變量函數配置,能夠支持很複雜的代碼生成。下面我來介紹一下Live Templates
的用法。git
IDEA 自帶不少經常使用的動態模板,在 Java 代碼中輸入fori
,回車就會出現github
1
2
3
|
for (int i = 0; i < ; i++) {
}
|
按Tab
能夠在各個空白處跳轉,手動填值。vim
官方自帶模板畢竟不能知足咱們我的編碼風格的須要,Live Templates
提供了變量函數的方式供咱們自定義。api
新增自定義模板,首先須要填寫觸發單詞(即 Abbreviation),描述是可選的,而後定義模板的上下文,點擊define
選擇Java
,這樣在編輯 Java 的時候就會觸發當前模板,定義完上下文以後,就能夠填寫模板了。數組
下面列舉幾個我經常使用的簡單模板ide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
==========
<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$
}
==========
|
模板支持變量的定義,使用$$
包圍的字符表示一個變量。$END$
是一個特殊的預約義變量,表示光標最後跳轉的位置。每一個變量的位置均可以跳轉過去。函數
若是你用過 vim 的Code Sinppet
插件,你會發現模板裏面是能夠執行函數的,強大的 Live Templates
固然也支持,並且 IDEA 可以感知代碼的語義,例如說當前編輯的函數的參數。但這一點就可以讓咱們玩出花來。咱們從易到難來研究模板函數的功能。
前面咱們提到的變量能夠綁定函數,配置方式如上圖所示。工具
聲明變量是一個經常使用的操做,特別是須要聲明變量須要加註解,註釋的時候,這些代碼寫起來就很枯燥。下面是我定義的模板:編碼
1
2
3
4
5
6
7
8
|
<osgiRef>
----------
/**
* $END$
*/
@OsgiReference
@Setter
private $TYPE$ $NAME$;
|
乍一看這個模板跟我上面定義的privateField
差很少,惟一的不一樣在於我給這些變量綁定了函數。
clipboard()
:返回當前粘貼板的字符串decapitalize()
:將輸入的字符串首字母變爲小寫下面咱們演示一下,咱們先拷貝當前類名,而後輸入osgiRef
聲明 logger 也是一個經常使用的操做,上面咱們是利用了粘貼函數來快速聲明變量,如今咱們來利用另外一個函數className()
,顧名思義,它的做用就是返回當前類名。
1
2
3
4
|
<logger>
----------
/** logger */
private static final Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);
|
若是說上面用到的函數提供的能力有限,不夠靈活,那麼groovyScript()
提供了一切你想要的能力,它支持執行 Groovy 腳本處理輸入,而後輸出處理後的字符串。
1
2
3
4
|
groovyScript("code", ...)
| code | 一段Groovy代碼或者Groovy腳本代碼絕對路徑 |
| ... | 可選入參,這些參數會綁定到`_1, _2, _3, ..._n`, 在 Groovy 代碼中使用。|
|
下面咱們來看一下它的實際應用。
新增一個服務都要在 Spring 中註冊一個 bean,通常這個配置無非就是將指明id
和class
,因爲咱們是在 xml 中配置,因此不能利用className()
函數,可是咱們能夠利用clipboard()
函數獲取到類的全引用,在 IDEA 中咱們直接右鍵類名,點擊Copy Reference
就行。而後執行 groovy 腳本獲取類名。
1
2
3
|
<bean>
----------
<bean id="$id$" class="$REF$" />
|
id
綁定decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard()))
,首先取clipboard()
的值獲得類的全引用,而後執行 groovy 代碼_1.tokenize('.')[-1]
(按.
分割爲字符串數組,而後取最後一個便可獲得類名,而後用decapitalize()
將首字母小寫便可獲得id
。
打印錯誤日誌的時候須要打印當前上下文信息的,例如說入參,有時候入參不少的時候,寫起來很痛苦,好在有模板函數methodParameters()
,返回當前函數參數的列表,固然這個列表咱們不能直接使用,須要結合groovyScript
對它進行轉化。
1
2
3
|
<printContext>
---------------
LogUtil.$TYPE$(LOGGER, "$MSG$ " + $params$);
|
將params
綁定到groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters())
,就可以自動將當前函數的參數格式化後輸出。
上面咱們簡單介紹了經常使用的模板函數,其實 IDEA 還有不少其它模板函數,具體參考Creating and Editing Template Variables。IDEA 是一個很強大的工具,善用工具可以極大的提升工做效率,將精力投入到關鍵的事情上,而不是將時間浪費在編寫重複代碼上面。一些更高級的用法還有待你們去發掘。最後推廣一波我寫的代碼生成插件CodeMaker,好好利用也能節省不少重複編寫代碼的時間。