欧美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ù)庫表對象model

java bean對象如下:

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 下。

具體測試類

如下:

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文件代碼中屬性對應(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;
    }

     // 測試一下
    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);
    }
}

測試結(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ā)送類型'}

上述測試類需要用到的 POJO對象如下:

package com.xxx.doc;

/**
 * 屬性字段對應(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)文章

  • 探討Java驗(yàn)證碼制作(下篇)

    探討Java驗(yàn)證碼制作(下篇)

    這篇文章主要介紹了探討Java驗(yàn)證碼制作(下篇)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Java請求轉(zhuǎn)發(fā)和請求重定向區(qū)別詳解

    Java請求轉(zhuǎn)發(fā)和請求重定向區(qū)別詳解

    這篇文章主要介紹了Java請求轉(zhuǎn)發(fā)和請求重定向區(qū)別詳解,請求轉(zhuǎn)發(fā)和請求重定向,但二者是完全不同的,所以我們今天就來盤他們的區(qū)別介紹,需要的朋友可以參考一下
    2022-07-07
  • SpringBoot?錯(cuò)誤頁面跳轉(zhuǎn)方式

    SpringBoot?錯(cuò)誤頁面跳轉(zhuǎn)方式

    這篇文章主要介紹了SpringBoot?錯(cuò)誤頁面跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • spring boot系列之集成測試(推薦)

    spring boot系列之集成測試(推薦)

    這篇文章主要介紹了spring boot系列集成測試,需要的朋友可以參考下
    2018-03-03
  • SpringCloud?hystrix斷路器與局部降級全面介紹

    SpringCloud?hystrix斷路器與局部降級全面介紹

    什么是服務(wù)降級?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對一些服務(wù)和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作
    2022-10-10
  • JDK的Parser來解析Java源代碼詳解

    JDK的Parser來解析Java源代碼詳解

    這篇文章主要介紹了JDK的Parser來解析Java源代碼的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • mybatis關(guān)系映射之一對多和多對一

    mybatis關(guān)系映射之一對多和多對一

    今天小編就為大家分享一篇關(guān)于mybatis關(guān)系映射之一對多和多對一,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作

    DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作

    這篇文章主要介紹了DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot設(shè)置靜態(tài)資源訪問控制和封裝集成方案

    SpringBoot設(shè)置靜態(tài)資源訪問控制和封裝集成方案

    這篇文章主要介紹了SpringBoot靜態(tài)資源訪問控制和封裝集成方案,關(guān)于springboot靜態(tài)資源訪問的問題,小編是通過自定義webconfig實(shí)現(xiàn)WebMvcConfigurer,重寫addResourceHandlers方法,具體完整代碼跟隨小編一起看看吧
    2021-08-08
  • 關(guān)于Spring啟動(dòng)流程及Bean生命周期梳理

    關(guān)于Spring啟動(dòng)流程及Bean生命周期梳理

    這篇文章主要介紹了關(guān)于Spring啟動(dòng)流程及Bean生命周期梳理,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論