Java 開發過程經常需要編寫有固定格式的代碼,例如說聲明一個私有變量, logger
或者 bean
等等。對於這種小范圍的代碼生成,我們可以利用 IDEA 提供的 Live Templates
功能。剛開始覺得它只是一個簡單的 Code Snippet
,后來發現它支持變量函數配置,可以支持很復雜的代碼生成。下面我來介紹一下 Live Templates
的用法。
基本使用
IDEA 自帶很多常用的動態模板,在 Java 代碼中輸入 fori
,回車就會出現
for (int i = 0; i < ; i++) { }
按
Tab
可以在各個空白處跳轉,手動填值。
自定義 Template
官方自帶模板畢竟不能滿足我們個人編碼風格的需要, Live Templates
提供了變量函數的方式供我們自定義。
簡單用法
新增自定義模板,首先需要填寫觸發單詞(即 Abbreviation),描述是可選的,然后定義模板的上下文,點擊 define
選擇 Java
,這樣在編輯 Java 的時候就會觸發當前模板,定義完上下文之后,就可以填寫模板了。
下面列舉幾個我常用的簡單模板
==========
<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 能夠感知代碼的語義,例如說當前編輯的函數的參數。但這一點就能夠讓我們玩出花來。我們從易到難來研究模板函數的功能。

前面我們提到的變量可以綁定函數,配置方式如上圖所示。
快速聲明變量
聲明變量是一個常用的操作,特別是需要聲明變量需要加注解,注釋的時候,這些代碼寫起來就很枯燥。下面是我定義的模板:
<osgiRef>
----------
/**
* $END$
*/
@OsgiReference @Setter private $TYPE$ $NAME$;
乍一看這個模板跟我上面定義的 privateField
差不多,唯一的不同在於我給這些變量綁定了函數。
clipboard()
:返回當前粘貼板的字符串decapitalize()
:將輸入的字符串首字母變為小寫
下面我們演示一下,我們先拷貝當前類名,然后輸入 osgiRef
快速聲明 logger
聲明 logger 也是一個常用的操作,上面我們是利用了粘貼函數來快速聲明變量,現在我們來利用另一個函數 className()
,顧名思義,它的作用就是返回當前類名。
<logger>
----------
/** logger */
private static final Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);
最強大的 groovyScript()
如果說上面用到的函數提供的能力有限,不夠靈活,那么 groovyScript()
提供了一切你想要的能力,它支持執行 Groovy 腳本處理輸入,然后輸出處理后的字符串。
groovyScript("code", ...)
| code | 一段Groovy代碼或者Groovy腳本代碼絕對路徑 | | ... | 可選入參,這些參數會綁定到`_1, _2, _3, ..._n`, 在 Groovy 代碼中使用。|
下面我們來看一下它的實際應用。
快速 bean 配置
新增一個服務都要在 Spring 中注冊一個 bean,一般這個配置無非就是將指明 id
和 class
,由於我們是在 xml 中配置,所以不能利用 className()
函數,但是我們可以利用 clipboard()
函數獲取到類的全引用,在 IDEA 中我們直接右鍵類名,點擊 Copy Reference
就行。然后執行 groovy 腳本獲取類名。
<bean>
----------
<bean id="$id$" class="$REF$" />
id
綁定 decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard()))
,首先取 clipboard()
的值得到類的全引用,然后執行 groovy 代碼 _1.tokenize('.')[-1]
(按 .
分割為字符串數組,然后取最后一個即可得到類名,然后用 decapitalize()
將首字母小寫即可得到 id
。
快速打印當前上下文信息
打印錯誤日志的時候需要打印當前上下文信息的,例如說入參,有時候入參很多的時候,寫起來很痛苦,好在有模板函數 methodParameters()
,返回當前函數參數的列表,當然這個列表我們不能直接使用,需要結合 groovyScript
對它進行轉化。
<printContext>
---------------
LogUtil.$TYPE$(LOGGER, "$MSG$ " + $params$);
將 params
綁定到 groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters())
,就能夠自動將當前函數的參數格式化后輸出。
總結
上面我們簡單介紹了常用的模板函數,其實 IDEA 還有很多其它模板函數,具體參考 Creating and Editing Template Variables 。IDEA 是一個很強大的工具,善用工具能夠極大的提高工作效率,將精力投入到關鍵的事情上,而不是將時間浪費在編寫重復代碼上面。一些更高級的用法還有待大家去發掘。最后推廣一波我寫的代碼生成插件 CodeMaker ,好好利用也能節省很多重復編寫代碼的時間。