代碼生成利器:IDEA 強大的 Live Templates

JeannaSong 7年前發布 | 29K 次閱讀 Groovy Java Java開發

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 差不多,唯一的不同在于我給這些變量綁定了函數。

  1. clipboard() :返回當前粘貼板的字符串
  2. 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 ,好好利用也能節省很多重復編寫代碼的時間。

 

來自:http://blog.xiaohansong.com/2017/03/17/idea-live-templates/

 

 本文由用戶 JeannaSong 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!