前言
相信很多人在設置模板注釋的時候,尤其是在設置方法模板注釋時,都遇到了各種問題(比如參數和返回值為空的情況)。也都在網上進行了很多搜索,但是你懂得,最終都無功而返,本文則將為你解決這一問題,由於設置類的模板注釋很簡單,網上搜索的方法也都可以解決生成類的模板注釋的情況,因此本文不做介紹,將只介紹如何生成方法模板注釋,此外還會詳細介紹使用到的Groovy
腳本的具體含義,以便你可以寫你自己的Groovy
腳本,滿足你自己的需求,在最后還會通過一個Gif
動圖,來展示具體的使用方法,話不多說,開始介紹。
創建模板
首先點擊File -> Settings -> Editor -> Live Templates
,會出現以下界面:
然后我們需要點擊+
,選擇Template Group...
:
然后隨便取一個名字,點擊OK
:
然后按照下圖,首先選中我們剛創建的Group
,然后點擊+
並選擇Live Template
:
然后在彈出的界面先填入圖中標注的信息:
圖中1
處的位置按照傳統(相信大多數人以前也是這么設置的)就繼續用*
了,對應的Template text
如下:
**
* description
$params$
*
$return$
* @author zjw
* @createTime $date$ $time$
*/
這里需要特別注意,Template text
的內容最開始處不可以是/**
開頭,否則會出現參數和返回值為空的情況,看到這里你可能覺得你之前也這樣設置過,也是不起作用,但是請你繼續看下去,因為我之前也遇到過,此外我這里的Template text
也是為了配合之后腳本的代碼,所以看起來可能不太一樣。
然后需要需要按照下圖的步驟設置一下Application Contexts
,需要選擇Java
,結束之后記得點擊一下Apply
:
配置腳本
完成了以上步驟后,就可以開始配置對應的腳本了,按照下圖步驟,並在2
和3
處分別輸入以下兩個Groovy
腳本(腳本含義稍后介紹),4
和5
處在下拉框中選擇系統默認的即可:
groovyScript("def result='';def flag=false;def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {if (!params[i].equals('')) {flag=true;result+='* @param ' + params[i] + ' ' + params[i] + ((i < params.size() - 1) ? '\\n\\t ':'')} else {result+=' *'}}; return flag ? ' *\\n\t ' + result : result", methodParameters())
groovyScript("def params=\"${_1}\";def index=params.lastIndexOf('.', params.indexOf('<'));if(index!=-1){params=params.substring(index+1);};index=params.indexOf('.');if(index!=-1&¶ms.indexOf('<')==-1){params=params.substring(index+1);};return ' * @return ' + params.replaceAll('java.lang.', '').replaceAll(',',', ');", methodReturnType())
完成一點配置后點擊OK
和Apply
即可使用我們的模板啦。
注釋使用測試
在講解上述Groovy
腳本的含義之前,先來看一下我們上述配置的注釋模板如何使用:
我們只需要在需要添加注釋的方法上輸入/*
然后按下Tab
即可生成,這里的*
對應着上述的Abbreviation
里配置的*
,等於使用*
去替換上述配置的Template text
,並在Template text
前加了一個/
,即可成功添加我們的注釋模板,對應的Gif
操作動圖如下:
腳本含義介紹
這里以設置$return$
的腳本為例,為了解釋方便,將腳本做了一些格式化,代碼及其含義直接如下,Groovy
和Java
的語法很相似,所以不難理解:
groovyScript("
// 將 methodReturnType() 的返回值轉化為字符串賦給 params
// 默認的返回值格式為 pojo.User / java.lang.int 等形式
def params = \"${_1}\";
// 如果返回值有集合時,原始形式為 java.util.List<java.lang.Integer> 這種形式
// 這里獲取 '<' 前的 '.' 下標
def index = params.lastIndexOf('.', params.indexOf('<'));
if (index != -1) {
// 執行到這里說明返回值有泛型,為了看着更舒服
// 這里的作用是把 java.util.List<java.lang.Integer> 變為 List<java.lang.Integer>
params = params.substring(index + 1);
};
// 這里繼續獲取 '.' 的下標
index = params.indexOf('.');
// 如果 '.' 存在,且不存在 '<' 說明返回值沒有泛型
if (index != -1 && params.indexOf('<') == -1) {
// 把返回值為 pojo.User 這種變為 User
params = params.substring(index + 1);
};
// 當返回值為基本類型時,都會有 'java.lang.' 前綴
// 例如 java.lang.int ,這里去掉了 java.lang.
// 此外將返回結果中的 ','替換為', '是為了處理 有多個泛型參數的情況
// 例如原始返回值可能為 java.util.Map<java.lang.Integer,java.lang.String>
// 這里為了讓泛型之間的 ',' 變成 ', ' 更加美觀
// 需要注意的是,我沒有處理 java.util.List<pojo.User> 這種情況
// 經過這些代碼只會變為 List<pojo.User>, 這個就留給大家自己做了
return ' * @return ' + params.replaceAll('java.lang.', '').replaceAll(',', ', ');
",
methodReturnType()
)
注意
我這里只展示了處理return
的腳本代碼的所有含義,代碼中也顯得有些丑陋,所以還是希望各位能寫出各自的Grovvy
腳本,然后分享一下,因為我的param
的腳本寫的太丑了,這里就不做講解了,如果有問題,你也可以進行留言。
總結
本文講解了使用IDEA
生成自定義方法模板注釋可能會遇到的一些問題,當然可能因為一些版本原因,或者操作原因,你可能仍然會遇到一些問題,也歡迎你進行留言,一起討論。