IDEA插件实现根据字段注释生成getter/setter方法Javadoc注释

本文详细介绍了如何在IntelliJ IDEA中配置JavaDoc插件,以自动生成类、方法和字段的注释。通过设置模板和匹配正则表达式,实现了对已有注释的保留和不同元素的注释需求。此外,还分享了针对getter、setter、构造函数和toString方法的特定注释模板,以及字段注释的简化方式。
摘要由CSDN通过智能技术生成

效果

注释前代码示例:

public class ContactDto {
    /** id */
    private Long id;
    /** 联系人姓名 */
    private String contactName;
    
    public ContactDto() {}
    public ContactDto(Long id, String contactName) {
        this.id = id;
        this.contactName = contactName;
    }

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getContactName() { return contactName; }
    public void setContactName(String contactName) { this.contactName = contactName; }
}

自动生成后:

package com.ssp.middle.demo.dto;

public class ContactDto {
    /** id */
    private Long id;
    /** 联系人姓名 */
    private String contactName;

    /**
     * 实例化一个新的ContactDto。
     */
    public ContactDto() {}

    /**
     * 实例化一个新的ContactDto。
     *
     * @param id          id
     * @param contactName 联系人姓名
     */
    public ContactDto(Long id, String contactName) {
        this.id = id;
        this.contactName = contactName;
    }

    /**
     * 获取id。
     *
     * @return id
     */
    public Long getId() { return id; }

    /**
     * 设置id。
     *
     * @param id id
     */
    public void setId(Long id) { this.id = id; }

    /**
     * 获取联系人姓名。
     *
     * @return 联系人姓名
     */
    public String getContactName() { return contactName; }

    /**
     * 设置联系人姓名。
     *
     * @param contactName 联系人姓名
     */
    public void setContactName(String contactName) { this.contactName = contactName; }
}

方法

步骤

  1. 下载安装IDEA的JavaDoc插件。
  2. 打开选项:File - Settings - Tools - JavaDoc
  3. General选项卡:
    1. 我不想让自动生成的注释覆盖手动添加的注释,因此把Mode改成Update old javadoc。
    2. 我的目的是给字段和方法加注释,因此勾选Level中的Method(方法)和Field(字段),取消勾选Type(类/接口/枚举)。
    3. 我想给所有元素(包括私有)加注释,所以勾选Visibility中的全部4个。
    4. Other里面我是全勾选的,不过应该没有影响。
  4. Templates选项卡设置模板,见下文。

模板

Class Level

这里可以设置类/接口/枚举的注释模板,我这里没有使用(而且之前也取消勾选了)。

Constructor Level

这里设置的是类和枚举的构造函数注释模板。默认的模板我不用,因此我删掉了,写了一个对所有构造函数生效的模板:

匹配正则表达式:.+

/**\n
 * <#if element.parent.isEnum()>定义<#else>实例化</#if>一个新的${element.name}。\n
<#if element.parameterList.parameters?has_content>         *\n
</#if><#list element.parameterList.parameters as parameter>         * @param ${parameter.name} <#if element.getParent().findFieldByName(parameter.name,true)?? 
	  & element.getParent().findFieldByName(parameter.name,true).getDocComment()??
       >${element.getParent().findFieldByName(parameter.name,true).getDocComment().getDescriptionElements()[1].getText()?trim}<#else>${parameter.name}</#if>\n
</#list><#if element.throwsList.referenceElements?has_content>         *\n
</#if><#list element.throwsList.referenceElements as exception>         * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
</#list> */

Method Level

这里设置方法的注释模板。自带的四个模板分别是:getter,setter,main方法和所有方法。我这里不用后两个,因此直接删了;getter和setter方法做了修改。

Getter方法

我只想给不带参数的getXxx方法加注释,因此修改了正则表达式最后的\(.*\).+,改为了\(\s*\).+。即:

匹配正则表达式:^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(\s*\).+

模板:

/**\n
 * 获取<#if element.getParent().findFieldByName(fieldName,true)?? 
	  & element.getParent().findFieldByName(fieldName,true).getDocComment()??
       >${element.getParent().findFieldByName(fieldName,true).getDocComment().getDescriptionElements()[1].getText()?trim}<#else>${fieldName}</#if>。\n
<#if element.typeParameters?has_content>         * \n
</#if><#list element.typeParameters as typeParameter>         * @param <${typeParameter.name}> \n
</#list><#if element.parameterList.parameters?has_content>         *\n
</#if><#list element.parameterList.parameters as parameter>         * @param ${parameter.name} <#if element.getParent().findFieldByName(parameter.name,true)?? 
	  & element.getParent().findFieldByName(parameter.name,true).getDocComment()??
       >${element.getParent().findFieldByName(parameter.name,true).getDocComment().getDescriptionElements()[1].getText()?trim}<#else>${parameter.name}</#if>\n
</#list><#if isNotVoid>         *\n
         * @return <#if element.getParent().findFieldByName(fieldName,true)?? 
	  & element.getParent().findFieldByName(fieldName,true).getDocComment()??
       >${element.getParent().findFieldByName(fieldName,true).getDocComment().getDescriptionElements()[1].getText()?trim}<#else>${fieldName}</#if>\n
</#if><#if element.throwsList.referenceElements?has_content>         *\n
</#if><#list element.throwsList.referenceElements as exception>         * @throws ${exception.referenceName}\n
</#list> */

这个模板和Setter保持了一致(除了“获取”和“设置”两个字)。

Setter方法

与Getter类似,我修改了一下正则表达式,限定了参数个数为一个:

匹配正则表达式:^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(\S+\s+\S+\).+

模板和Getter一样,除了“获取”二字改成“设置”。

toString方法

另外我还单独添加领toString方法的模板。

匹配正则表达式:^.*public\s+String\s+toString\s*\(\s*\).*

/** \n
 * 转为字符串。\n
 * \n
 * @return 字符串\n
 */

Field Level

默认的字段注释模板是把字段名的每个单词拆开。我直接把所有字段注释模板改成了字段名:

/** ${element.getName()} */

原理

简单来说,就是${element}就是IDEA的插件开发SDK中的PsiElement对象,可以从这里开始顺着文档树,通过字段名找到字段的JavaDoc注释。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值