強大的 IDEA 代碼生成
作者:Sharehub
Java 開發(fā)過程經(jīng)常需要編寫有固定格式的代碼,例如說聲明一個私有變量,logger或者bean等等。對于這種小范圍的代碼生成,我們可以利用 IDEA 提供的 Live Templates功能。剛開始覺得它只是一個簡單的Code Snippet,后來發(fā)現(xiàn)它支持變量函數(shù)配置,可以支持很復(fù)雜的代碼生成。 下面我來介紹一下Live Templates的用法。 基本使用
IDEA 自帶很多常用的動態(tài)模板,在 Java 代碼中輸入fori,回車就會出現(xiàn) for?(int?i =?0; i < ; i++) {
}

按Tab可以在各個空白處跳轉(zhuǎn),手動填值。
自定義 Template
官方自帶模板畢竟不能滿足我們個人編碼風(fēng)格的需要,Live Templates提供了變量函數(shù)的方式供我們自定義。搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)“2T”,獲取一份驚喜禮包。 簡單用法
新增自定義模板,首先需要填寫觸發(fā)單詞(即 Abbreviation),描述是可選的,然后定義模板的上下文,點擊define選擇Java,這樣在編輯 Java 的時候就會觸發(fā)當前模板,定義完上下文之后,就可以填寫模板了。 
下面列舉幾個我常用的簡單模板 ==========
----------
System.out.println($END$)
==========
----------
private?final?static?String $varName$ =?"$var$";`
==========
----------
/**
?* $COMMENT$
?*/
@Getter
@Setter
private?$TYPE$ $NAME$;
==========
----------
public?static?void main(String[] args) {
?????$END$
}
==========
模板支持變量的定義,使用$$包圍的字符表示一個變量。$END$是一個特殊的預(yù)定義變量,表示光標最后跳轉(zhuǎn)的位置。每個變量的位置都可以跳轉(zhuǎn)過去。
高級用法
如果你用過 vim 的Code Sinppet插件,你會發(fā)現(xiàn)模板里面是可以執(zhí)行函數(shù)的,強大的 Live Templates當然也支持,而且 IDEA 能夠感知代碼的語義,例如說當前編輯的函數(shù)的參數(shù)。但這一點就能夠讓我們玩出花來。我們從易到難來研究模板函數(shù)的功能。搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)“2T”,獲取一份驚喜禮包。 
前面我們提到的變量可以綁定函數(shù),配置方式如上圖所示。 快速聲明變量 聲明變量是一個常用的操作,特別是需要聲明變量需要加注解,注釋的時候,這些代碼寫起來就很枯燥。下面是我定義的模板:
----------
/**
?* $END$
?*/
@OsgiReference
@Setter
private?$TYPE$?$NAME$;
乍一看這個模板跟我上面定義的privateField差不多,唯一的不同在于我給這些變量綁定了函數(shù)。 下面我們演示一下,我們先拷貝當前類名,然后輸入osgiRef 
快速聲明 logger 聲明 logger 也是一個常用的操作,上面我們是利用了粘貼函數(shù)來快速聲明變量,現(xiàn)在我們來利用另一個函數(shù)className(),顧名思義,它的作用就是返回當前類名。 搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)“2T”,獲取一份驚喜禮包。
----------
/** logger */
private?static?final?Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);

最強大的 groovyScript()
如果說上面用到的函數(shù)提供的能力有限,不夠靈活,那么groovyScript()提供了一切你想要的能力,它支持執(zhí)行 Groovy 腳本處理輸入,然后輸出處理后的字符串。 groovyScript("code", ...)
| code |???一段Groovy代碼或者Groovy腳本代碼絕對路徑?|
|??...?| 可選入?yún)ⅲ@些參數(shù)會綁定到`_1, _2, _3, ..._n`, 在 Groovy 代碼中使用。|
下面我們來看一下它的實際應(yīng)用。 快速 bean 配置 新增一個服務(wù)都要在 Spring 中注冊一個 bean,一般這個配置無非就是將指明id和class,由于我們是在 xml 中配置,所以不能利用className()函數(shù),但是我們可以利用clipboard()函數(shù)獲取到類的全引用,在 IDEA 中我們直接右鍵類名,點擊Copy Reference就行。然后執(zhí)行 groovy 腳本獲取類名。
----------
"$id$" ?class="$REF$"?/>
id綁定decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard())),首先取clipboard()的值得到類的全引用,然后執(zhí)行 groovy 代碼_1.tokenize('.')[-1](按.分割為字符串數(shù)組,然后取最后一個即可得到類名,然后用decapitalize()將首字母小寫即可得到id。 
快速打印當前上下文信息 打印錯誤日志的時候需要打印當前上下文信息的,例如說入?yún)ⅲ袝r候入?yún)⒑芏嗟臅r候,寫起來很痛苦,好在有模板函數(shù)methodParameters(),返回當前函數(shù)參數(shù)的列表,當然這個列表我們不能直接使用,需要結(jié)合groovyScript對它進行轉(zhuǎn)化。
---------------
LogUtil.$TYPE$(LOGGER,?"$MSG$ "?+ $params$);
將params綁定到groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters()),就能夠自動將當前函數(shù)的參數(shù)格式化后輸出。 
總結(jié)
上面我們簡單介紹了常用的模板函數(shù),其實 IDEA 還有很多其它模板函數(shù),具體參考Creating and Editing Template Variables。 https://www.jetbrains.com/help/idea/2016.3/creating-and-editing-template-variables.html IDEA 是一個很強大的工具,善用工具能夠極大的提高工作效率,將精力投入到關(guān)鍵的事情上,而不是將時間浪費在編寫重復(fù)代碼上面。一些更高級的用法還有待大家去發(fā)掘。最后推廣一波我寫的代碼生成插件CodeMaker,好好利用也能節(jié)省很多重復(fù)編寫代碼的時間。
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉(zhuǎn)發(fā)、在看。
作者:Sharehub Java 開發(fā)過程經(jīng)常需要編寫有固定格式的代碼,例如說聲明一個私有變量,logger或者bean等等。對于這種小范圍的代碼生成,我們可以利用 IDEA 提供的 Live Templates功能。剛開始覺得它只是一個簡單的Code Snippet,后來發(fā)現(xiàn)它支持變量函數(shù)配置,可以支持很復(fù)雜的代碼生成。 下面我來介紹一下Live Templates的用法。 基本使用
IDEA 自帶很多常用的動態(tài)模板,在 Java 代碼中輸入fori,回車就會出現(xiàn) for?(int?i =?0; i < ; i++) {
}按Tab可以在各個空白處跳轉(zhuǎn),手動填值。 自定義 Template
官方自帶模板畢竟不能滿足我們個人編碼風(fēng)格的需要,Live Templates提供了變量函數(shù)的方式供我們自定義。搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)“2T”,獲取一份驚喜禮包。 簡單用法
新增自定義模板,首先需要填寫觸發(fā)單詞(即 Abbreviation),描述是可選的,然后定義模板的上下文,點擊define選擇Java,這樣在編輯 Java 的時候就會觸發(fā)當前模板,定義完上下文之后,就可以填寫模板了。 下面列舉幾個我常用的簡單模板 ==========
----------
System.out.println($END$)
==========
----------
private?final?static?String $varName$ =?"$var$";`
==========
----------
/**
?* $COMMENT$
?*/
@Getter
@Setter
private?$TYPE$ $NAME$;
==========
----------
public?static?void main(String[] args) {
?????$END$
}
==========模板支持變量的定義,使用 $$包圍的字符表示一個變量。$END$是一個特殊的預(yù)定義變量,表示光標最后跳轉(zhuǎn)的位置。每個變量的位置都可以跳轉(zhuǎn)過去。高級用法
如果你用過 vim 的Code Sinppet插件,你會發(fā)現(xiàn)模板里面是可以執(zhí)行函數(shù)的,強大的 Live Templates當然也支持,而且 IDEA 能夠感知代碼的語義,例如說當前編輯的函數(shù)的參數(shù)。但這一點就能夠讓我們玩出花來。我們從易到難來研究模板函數(shù)的功能。搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)“2T”,獲取一份驚喜禮包。 前面我們提到的變量可以綁定函數(shù),配置方式如上圖所示。 快速聲明變量 聲明變量是一個常用的操作,特別是需要聲明變量需要加注解,注釋的時候,這些代碼寫起來就很枯燥。下面是我定義的模板:
----------
/**
?* $END$
?*/
@OsgiReference
@Setter
private?$TYPE$?$NAME$;乍一看這個模板跟我上面定義的privateField差不多,唯一的不同在于我給這些變量綁定了函數(shù)。 下面我們演示一下,我們先拷貝當前類名,然后輸入osgiRef 快速聲明 logger 聲明 logger 也是一個常用的操作,上面我們是利用了粘貼函數(shù)來快速聲明變量,現(xiàn)在我們來利用另一個函數(shù)className(),顧名思義,它的作用就是返回當前類名。 搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)“2T”,獲取一份驚喜禮包。
----------
/** logger */
private?static?final?Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);最強大的 groovyScript()
如果說上面用到的函數(shù)提供的能力有限,不夠靈活,那么groovyScript()提供了一切你想要的能力,它支持執(zhí)行 Groovy 腳本處理輸入,然后輸出處理后的字符串。 groovyScript("code", ...)
| code |???一段Groovy代碼或者Groovy腳本代碼絕對路徑?|
|??...?| 可選入?yún)ⅲ@些參數(shù)會綁定到`_1, _2, _3, ..._n`, 在 Groovy 代碼中使用。|下面我們來看一下它的實際應(yīng)用。 快速 bean 配置 新增一個服務(wù)都要在 Spring 中注冊一個 bean,一般這個配置無非就是將指明id和class,由于我們是在 xml 中配置,所以不能利用className()函數(shù),但是我們可以利用clipboard()函數(shù)獲取到類的全引用,在 IDEA 中我們直接右鍵類名,點擊Copy Reference就行。然后執(zhí)行 groovy 腳本獲取類名。 ?class="$REF$"?/>
----------"$id$" id綁定 decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard())),首先取clipboard()的值得到類的全引用,然后執(zhí)行 groovy 代碼_1.tokenize('.')[-1](按.分割為字符串數(shù)組,然后取最后一個即可得到類名,然后用decapitalize()將首字母小寫即可得到id。快速打印當前上下文信息 打印錯誤日志的時候需要打印當前上下文信息的,例如說入?yún)ⅲ袝r候入?yún)⒑芏嗟臅r候,寫起來很痛苦,好在有模板函數(shù)methodParameters(),返回當前函數(shù)參數(shù)的列表,當然這個列表我們不能直接使用,需要結(jié)合groovyScript對它進行轉(zhuǎn)化。
---------------
LogUtil.$TYPE$(LOGGER,?"$MSG$ "?+ $params$);將params綁定到 groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters()),就能夠自動將當前函數(shù)的參數(shù)格式化后輸出。總結(jié)
上面我們簡單介紹了常用的模板函數(shù),其實 IDEA 還有很多其它模板函數(shù),具體參考Creating and Editing Template Variables。 https://www.jetbrains.com/help/idea/2016.3/creating-and-editing-template-variables.html IDEA 是一個很強大的工具,善用工具能夠極大的提高工作效率,將精力投入到關(guān)鍵的事情上,而不是將時間浪費在編寫重復(fù)代碼上面。一些更高級的用法還有待大家去發(fā)掘。最后推廣一波我寫的代碼生成插件CodeMaker,好好利用也能節(jié)省很多重復(fù)編寫代碼的時間。 PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉(zhuǎn)發(fā)、在看。
評論
圖片
表情
