代码生成利器:IDEA 强大的 Live Templates - 文章 - 伯乐在线
http://blog.jobbole.com/110607/html
Java 开发过程常常须要编写有固定格式的代码,例如说声明一个私有变量,logger
或者bean
等等。对于这种小范围的代码生成,咱们能够利用 IDEA 提供的 Live Templates
功能。刚开始以为它只是一个简单的Code Snippet
,后来发现它支持变量函数配置,能够支持很复杂的代码生成。下面我来介绍一下Live Templates
的用法。git
IDEA 自带不少经常使用的动态模板,在 Java 代码中输入fori
,回车就会出现github
1
2
3
|
for (int i = 0; i < ; i++) {
}
|
按Tab
能够在各个空白处跳转,手动填值。vim
官方自带模板毕竟不能知足咱们我的编码风格的须要,Live Templates
提供了变量函数的方式供咱们自定义。api
新增自定义模板,首先须要填写触发单词(即 Abbreviation),描述是可选的,而后定义模板的上下文,点击define
选择Java
,这样在编辑 Java 的时候就会触发当前模板,定义完上下文以后,就能够填写模板了。数组
下面列举几个我经常使用的简单模板ide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
==========
<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 可以感知代码的语义,例如说当前编辑的函数的参数。但这一点就可以让咱们玩出花来。咱们从易到难来研究模板函数的功能。
前面咱们提到的变量能够绑定函数,配置方式如上图所示。工具
声明变量是一个经常使用的操做,特别是须要声明变量须要加注解,注释的时候,这些代码写起来就很枯燥。下面是我定义的模板:编码
1
2
3
4
5
6
7
8
|
<osgiRef>
----------
/**
* $END$
*/
@OsgiReference
@Setter
private $TYPE$ $NAME$;
|
乍一看这个模板跟我上面定义的privateField
差很少,惟一的不一样在于我给这些变量绑定了函数。
clipboard()
:返回当前粘贴板的字符串decapitalize()
:将输入的字符串首字母变为小写下面咱们演示一下,咱们先拷贝当前类名,而后输入osgiRef
声明 logger 也是一个经常使用的操做,上面咱们是利用了粘贴函数来快速声明变量,如今咱们来利用另外一个函数className()
,顾名思义,它的做用就是返回当前类名。
1
2
3
4
|
<logger>
----------
/** logger */
private static final Logger LOGGER = LoggerFactory.getLogger($CLASS$.class);
|
若是说上面用到的函数提供的能力有限,不够灵活,那么groovyScript()
提供了一切你想要的能力,它支持执行 Groovy 脚本处理输入,而后输出处理后的字符串。
1
2
3
4
|
groovyScript("code", ...)
| code | 一段Groovy代码或者Groovy脚本代码绝对路径 |
| ... | 可选入参,这些参数会绑定到`_1, _2, _3, ..._n`, 在 Groovy 代码中使用。|
|
下面咱们来看一下它的实际应用。
新增一个服务都要在 Spring 中注册一个 bean,通常这个配置无非就是将指明id
和class
,因为咱们是在 xml 中配置,因此不能利用className()
函数,可是咱们能够利用clipboard()
函数获取到类的全引用,在 IDEA 中咱们直接右键类名,点击Copy Reference
就行。而后执行 groovy 脚本获取类名。
1
2
3
|
<bean>
----------
<bean id="$id$" class="$REF$" />
|
id
绑定decapitalize(groovyScript("_1.tokenize('.')[-1]", clipboard()))
,首先取clipboard()
的值获得类的全引用,而后执行 groovy 代码_1.tokenize('.')[-1]
(按.
分割为字符串数组,而后取最后一个便可获得类名,而后用decapitalize()
将首字母小写便可获得id
。
打印错误日志的时候须要打印当前上下文信息的,例如说入参,有时候入参不少的时候,写起来很痛苦,好在有模板函数methodParameters()
,返回当前函数参数的列表,固然这个列表咱们不能直接使用,须要结合groovyScript
对它进行转化。
1
2
3
|
<printContext>
---------------
LogUtil.$TYPE$(LOGGER, "$MSG$ " + $params$);
|
将params
绑定到groovyScript("'\"' + _1.collect { it + ' = [\" + ' + it + ' + \"]'}.join(', ') + '\"'", methodParameters())
,就可以自动将当前函数的参数格式化后输出。
上面咱们简单介绍了经常使用的模板函数,其实 IDEA 还有不少其它模板函数,具体参考Creating and Editing Template Variables。IDEA 是一个很强大的工具,善用工具可以极大的提升工做效率,将精力投入到关键的事情上,而不是将时间浪费在编写重复代码上面。一些更高级的用法还有待你们去发掘。最后推广一波我写的代码生成插件CodeMaker,好好利用也能节省不少重复编写代码的时间。