欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何獲取java類中的屬性注釋

 更新時(shí)間:2024年09月27日 08:58:02   作者:小時(shí)候的陽光  
在開發(fā)中,有時(shí)需要獲取Java類的屬性注釋,尤其是當(dāng)JPA生成的表缺少注釋時(shí),可以通過jdk自帶的tools.jar工具包來實(shí)現(xiàn),方法類似于生成javadoc文檔,需要在pom.xml文件中導(dǎo)入tools.jar的依賴,該jar文件一般位于JAVA_HOME/lib目錄下

獲取java類中的屬性注釋

一般我們的某個(gè)數(shù)據(jù)庫(kù)表對(duì)象model

java bean對(duì)象如下:

package com.xxx.message.model;

import com.middol.common.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

/**
 * 郵件等消息發(fā)送歷史表
 *
 * @author xxxx
 */
@Entity
@Table(name = "T_messageHistory")
@Data
@EqualsAndHashCode(callSuper=true)
public class MessageHistory extends BaseModel {

    /**
     * 工廠id
     */
    @Column(name = "factoryId")
    private String factoryId;

    /**
     * 原有的 messageId
     */
    @Column(name = "messageId")
    private String messageId;

    /**
     * 接收方
     */
    @Column(name = "receiver")
    private String receiver;

    /**
     * 抄送方
     */
    @Column(name = "copy")
    private String copy;

    /**
     * 標(biāo)題
     */
    @Column(name = "subject")
    private String subject;

    /**
     * 內(nèi)容
     */
    @Column(name = "content", columnDefinition = "nvarchar(2000)")
    private String content;

    /**
     * 發(fā)送類型
     */
    @Column(name = "sendType")
    private String sendType;
}

特殊情況下我們可能需要獲取這個(gè)類的屬性注釋

比如JPA生成的表沒有注釋,我們希望通過java類中的屬性注釋來更新一下表中字段注釋。

這里可以通過jdk自帶的 tools.jar工具包進(jìn)行獲取,主要類似于生成javadoc文檔那樣。

pom.xml文件中導(dǎo)入:

        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <scope>system</scope>
            <systemPath>${project.basedir}/tools.jar</systemPath>
        </dependency>

systemPath 可以指向磁盤具體的路徑,tools.jar一般在 JAVA_HOM/lib 下。

具體測(cè)試類

如下:

package com.xxx.doc;

import cn.hutool.core.util.ReflectUtil;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.RootDoc;
import org.apache.commons.compress.utils.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * 獲取某一個(gè)java文件代碼中屬性對(duì)應(yīng)的注釋
 *
 * @author guzt
 */
public class Doclet {

    public static Logger logger = LoggerFactory.getLogger(Doclet.class);

    private static RootDoc rootDoc;
    private String javaBeanFilePath;

    public static boolean start(RootDoc root) {
        rootDoc = root;
        return true;
    }

    public Doclet(String javaBeanFilePath) {
        this.javaBeanFilePath = javaBeanFilePath;
    }

    public ModelClassDocVO exec() {
        ModelClassDocVO modelClassDocVO = new ModelClassDocVO();
        com.sun.tools.javadoc.Main.execute(new String[]{"-doclet", Doclet.class.getName(), "-docletpath",
                Doclet.class.getResource("/").getPath(), "-encoding", "utf-8", javaBeanFilePath});
        ClassDoc[] classes = rootDoc.classes();

        if (classes == null || classes.length == 0) {
            logger.warn(javaBeanFilePath + " 無ClassDoc信息");
            return modelClassDocVO;
        }

        List<FildEntry> entrys = Lists.newArrayList();
        ClassDoc classDoc = classes[0];
        // 獲取類的名稱
        modelClassDocVO.setModelClassName(classDoc.name());
        // 獲取類的注釋
        String classComment = ReflectUtil.getFieldValue(classDoc, "documentation").toString();
        String spitStr = "\n";
        for (String msg : classComment.split(spitStr)) {
            if (!msg.trim().startsWith("@") && msg.trim().length() > 0) {
                modelClassDocVO.setModelCommentText(msg);
                break;
            }
        }
        // 獲取屬性名稱和注釋
        FieldDoc[] fields = classDoc.fields(false);
        for (FieldDoc field : fields) {
            entrys.add(new FildEntry(field.name(), field.type().typeName(), field.commentText()));
        }

        modelClassDocVO.setFildEntryList(entrys);
        return modelClassDocVO;
    }

     // 測(cè)試一下
    public static void main(String[] args) {
        Doclet doclet = new Doclet(
                "E:\\IDEA_HOME\\middol\\parent\\message\\src\\main\\java\\com\\middol\\message\\model\\MessageHistory.java");
        ModelClassDocVO modelClassDocVO = doclet.exec();
        logger.info("類注釋:" + modelClassDocVO.getModelCommentText());
        logger.info("屬性字段注釋如下:");
        modelClassDocVO.getFildEntryList().forEach(System.out::println);
    }
}

測(cè)試結(jié)果如下:

14:09:23.867 [main] INFO com.middol.doc.Doclet - 類注釋: 郵件等消息發(fā)送歷史表
14:09:23.871 [main] INFO com.middol.doc.Doclet - 屬性字段注釋如下:
Entry{fName='factoryId', fType='String', fExplain='工廠id'}
Entry{fName='messageId', fType='String', fExplain='原有的 messageId'}
Entry{fName='receiver', fType='String', fExplain='接收方'}
Entry{fName='copy', fType='String', fExplain='抄送方'}
Entry{fName='subject', fType='String', fExplain='標(biāo)題'}
Entry{fName='content', fType='String', fExplain='內(nèi)容'}
Entry{fName='sendType', fType='String', fExplain='發(fā)送類型'}

上述測(cè)試類需要用到的 POJO對(duì)象如下:

package com.xxx.doc;

/**
 * 屬性字段對(duì)應(yīng)注釋
 *
 * @author guzt
 */
public class FildEntry {

    /**
     * 參數(shù)名
     */
    private String fName;
    /**
     * 類型
     */
    private String fType;
    /**
     * 說明
     */
    private String fExplain;

    public FildEntry(String fName, String fType, String fExplain) {
        super();
        this.fName = fName;
        this.fType = fType;
        this.fExplain = fExplain;
    }

    @Override
    public String toString() {
        return "Entry{" +
                "fName='" + fName + '\'' +
                ", fType='" + fType + '\'' +
                ", fExplain='" + fExplain + '\'' +
                '}';
    }

    public String getfName() {
        return fName;
    }

    public void setfName(String fName) {
        this.fName = fName;
    }

    public String getfType() {
        return fType;
    }

    public void setfType(String fType) {
        this.fType = fType;
    }

    public String getfExplain() {
        return fExplain;
    }

    public void setfExplain(String fExplain) {
        this.fExplain = fExplain;
    }
}

package com.xxx.doc;

import java.util.List;

/**
 * model 類字段注釋
 * @author guzt
 */
public class ModelClassDocVO {


    private String modelTableName;

    private String modelClassName;

    private String modelCommentText;

    private List<FildEntry> fildEntryList;


    public String getModelTableName() {
        return modelTableName;
    }

    public void setModelTableName(String modelTableName) {
        this.modelTableName = modelTableName;
    }

    public String getModelClassName() {
        return modelClassName;
    }

    public void setModelClassName(String modelClassName) {
        this.modelClassName = modelClassName;
    }

    public String getModelCommentText() {
        return modelCommentText;
    }

    public void setModelCommentText(String modelCommentText) {
        this.modelCommentText = modelCommentText;
    }

    public List<FildEntry> getFildEntryList() {
        return fildEntryList;
    }

    public void setFildEntryList(List<FildEntry> fildEntryList) {
        this.fildEntryList = fildEntryList;
    }

    @Override
    public String toString() {
        return "ModelClassDocVO{" +
                "modelClassName='" + modelClassName + '\'' +
                ", modelCommentText='" + modelCommentText + '\'' +
                ", fildEntryList=" + fildEntryList +
                '}';
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論