安利一款 IDEA 中强大的代码生成利器
点击上方 Java后端,选择 设为星标
优质文章,及时送达作者 | Sharehub
链接 | blog.xiaohansong.com/idea-live-templates.html
前言
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():将输入的字符串首字母变为小写
<logger>
----------
/** logger */
private static final Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);
最强大的 groovyScript()
groovyScript("code", ...)
| code | 一段Groovy代码或者Groovy脚本代码绝对路径 |
| ... | 可选入参,这些参数会绑定到`_1, _2, _3, ..._n`, 在 Groovy 代码中使用。|
<bean>
----------
<bean id="$id$" class="$REF$" />
decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard()))
,首先取clipboard()
的值得到类的全引用,然后执行 groovy 代码_1.tokenize('.')[-1]
(按.分割为字符串数组,然后取最后一个即可得到类名,然后用decapitalize()
将首字母小写即可得到id。<printContext>
---------------
LogUtil.$TYPE$(LOGGER, "$MSG$ " + $params$);
groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters())
,就能够自动将当前函数的参数格式化后输出。