<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          強(qiáng)大的 IDEA 代碼生成

          共 3601字,需瀏覽 8分鐘

           ·

          2021-10-29 01:11

          點(diǎn)擊關(guān)注公眾號(hào),回復(fù)“2T”獲取2TB學(xué)習(xí)資源!
          互聯(lián)網(wǎng)架構(gòu)師后臺(tái)回復(fù) 2T 有特別禮包
          作者:Sharehub

          來(lái)源:blog.xiaohansong.com/idea-live-templates.html

          上一篇:為什么阿里巴巴禁止使用存儲(chǔ)過(guò)程?

          Java 開(kāi)發(fā)過(guò)程經(jīng)常需要編寫有固定格式的代碼,例如說(shuō)聲明一個(gè)私有變量,logger或者bean等等。對(duì)于這種小范圍的代碼生成,我們可以利用 IDEA 提供的 Live Templates功能。剛開(kāi)始覺(jué)得它只是一個(gè)簡(jiǎn)單的Code Snippet,后來(lái)發(fā)現(xiàn)它支持變量函數(shù)配置,可以支持很復(fù)雜的代碼生成。
          下面我來(lái)介紹一下Live Templates的用法。

          基本使用

          IDEA 自帶很多常用的動(dòng)態(tài)模板,在 Java 代碼中輸入fori,回車就會(huì)出現(xiàn)
          for (int i = 0; i < ; i++) {

          }


          按Tab可以在各個(gè)空白處跳轉(zhuǎn),手動(dòng)填值。

          自定義 Template

          官方自帶模板畢竟不能滿足我們個(gè)人編碼風(fēng)格的需要,Live Templates提供了變量函數(shù)的方式供我們自定義。

          簡(jiǎn)單用法

          新增自定義模板,首先需要填寫觸發(fā)單詞(即 Abbreviation),描述是可選的,然后定義模板的上下文,點(diǎn)擊define選擇Java,這樣在編輯 Java 的時(shí)候就會(huì)觸發(fā)當(dāng)前模板,定義完上下文之后,就可以填寫模板了。
          下面列舉幾個(gè)我常用的簡(jiǎn)單模板
          ==========
          <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$
          }
          ==========
          模板支持變量的定義,使用$$包圍的字符表示一個(gè)變量。$END$是一個(gè)特殊的預(yù)定義變量,表示光標(biāo)最后跳轉(zhuǎn)的位置。每個(gè)變量的位置都可以跳轉(zhuǎn)過(guò)去。

          高級(jí)用法

          如果你用過(guò) vim 的Code Sinppet插件,你會(huì)發(fā)現(xiàn)模板里面是可以執(zhí)行函數(shù)的,強(qiáng)大的 Live Templates當(dāng)然也支持,而且 IDEA 能夠感知代碼的語(yǔ)義,例如說(shuō)當(dāng)前編輯的函數(shù)的參數(shù)。但這一點(diǎn)就能夠讓我們玩出花來(lái)。我們從易到難來(lái)研究模板函數(shù)的功能。
          前面我們提到的變量可以綁定函數(shù),配置方式如上圖所示。
          快速聲明變量
          聲明變量是一個(gè)常用的操作,特別是需要聲明變量需要加注解,注釋的時(shí)候,這些代碼寫起來(lái)就很枯燥。下面是我定義的模板:
          <osgiRef>
          ----------
          /**
           * $END$
           */

          @OsgiReference
          @Setter
          private $TYPE$NAME$;
          乍一看這個(gè)模板跟我上面定義的privateField差不多,唯一的不同在于我給這些變量綁定了函數(shù)。
          下面我們演示一下,我們先拷貝當(dāng)前類名,然后輸入osgiRef
          快速聲明 logger
          聲明 logger 也是一個(gè)常用的操作,上面我們是利用了粘貼函數(shù)來(lái)快速聲明變量,現(xiàn)在我們來(lái)利用另一個(gè)函數(shù)className(),顧名思義,它的作用就是返回當(dāng)前類名。
          搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師后臺(tái)回復(fù)“2T”,獲取一份驚喜禮包。
          <logger>
          ----------
          /** logger */
          private static final Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);

          最強(qiáng)大的 groovyScript()

          如果說(shuō)上面用到的函數(shù)提供的能力有限,不夠靈活,那么groovyScript()提供了一切你想要的能力,它支持執(zhí)行 Groovy 腳本處理輸入,然后輸出處理后的字符串。
          groovyScript("code", ...)

          | code |   一段Groovy代碼或者Groovy腳本代碼絕對(duì)路徑 |
          |
            ... | 可選入?yún)ⅲ@些參數(shù)會(huì)綁定到`_1, _2, _3, ..._n`, 在 Groovy 代碼中使用。|
          下面我們來(lái)看一下它的實(shí)際應(yīng)用。
          快速 bean 配置
          新增一個(gè)服務(wù)都要在 Spring 中注冊(cè)一個(gè) bean,一般這個(gè)配置無(wú)非就是將指明id和class,由于我們是在 xml 中配置,所以不能利用className()函數(shù),但是我們可以利用clipboard()函數(shù)獲取到類的全引用,在 IDEA 中我們直接右鍵類名,點(diǎn)擊Copy Reference就行。然后執(zhí)行 groovy 腳本獲取類名。
          <bean>
          ----------
          <bean id="$id$" class="$REF$" />
          id綁定decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard())),首先取clipboard()的值得到類的全引用,然后執(zhí)行 groovy 代碼_1.tokenize('.')[-1](按.分割為字符串?dāng)?shù)組,然后取最后一個(gè)即可得到類名,然后用decapitalize()將首字母小寫即可得到id。
          快速打印當(dāng)前上下文信息
          打印錯(cuò)誤日志的時(shí)候需要打印當(dāng)前上下文信息的,例如說(shuō)入?yún)ⅲ袝r(shí)候入?yún)⒑芏嗟臅r(shí)候,寫起來(lái)很痛苦,好在有模板函數(shù)methodParameters(),返回當(dāng)前函數(shù)參數(shù)的列表,當(dāng)然這個(gè)列表我們不能直接使用,需要結(jié)合groovyScript對(duì)它進(jìn)行轉(zhuǎn)化。
          <printContext>
          ---------------
          LogUtil.$TYPE$(LOGGER, "$MSG$ " + $params$);
          將params綁定到groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters()),就能夠自動(dòng)將當(dāng)前函數(shù)的參數(shù)格式化后輸出。

          總結(jié)

          上面我們簡(jiǎn)單介紹了常用的模板函數(shù),其實(shí) IDEA 還有很多其它模板函數(shù),具體參考Creating and Editing Template Variables。
          https://www.jetbrains.com/help/idea/2016.3/creating-and-editing-template-variables.html
          IDEA 是一個(gè)很強(qiáng)大的工具,善用工具能夠極大的提高工作效率,將精力投入到關(guān)鍵的事情上,而不是將時(shí)間浪費(fèi)在編寫重復(fù)代碼上面。一些更高級(jí)的用法還有待大家去發(fā)掘。最后推廣一波我寫的代碼生成插件CodeMaker,好好利用也能節(jié)省很多重復(fù)編寫代碼的時(shí)間。

          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。

              · END ·
          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4.程序員一般可以從什么平臺(tái)接私活?

          5.37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個(gè)最新訪問(wèn)版本發(fā)布,新特性搶先看

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!

          瀏覽 46
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  永久免费不卡在线观看黄网站 | 欧美性猛交XXXX乱大交 | 亚洲孕交| 欧美久久一区二区三区四区视频 | 操碰在线观看视频 |