最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

獲取java類中的屬性注釋

一般我們的某個數(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;

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

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

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

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

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

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

pom.xml文件中導入:

        <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;

/**
 * 獲取某一個java文件代碼中屬性對應的注釋
 *
 * @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);
    }
}

測試結果如下:

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='標題'}
Entry{fName='content', fType='String', fExplain='內(nèi)容'}
Entry{fName='sendType', fType='String', fExplain='發(fā)送類型'}

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

package com.xxx.doc;

/**
 * 屬性字段對應注釋
 *
 * @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 +
                '}';
    }
}

總結

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

相關文章

  • java實現(xiàn)數(shù)組中的逆序對

    java實現(xiàn)數(shù)組中的逆序對

    這篇文章主要為大家詳細介紹了java實現(xiàn)數(shù)組中的逆序對,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • SpringBoot?Validation快速實現(xiàn)數(shù)據(jù)校驗的示例代碼

    SpringBoot?Validation快速實現(xiàn)數(shù)據(jù)校驗的示例代碼

    在實際開發(fā)中,肯定會經(jīng)常遇到對參數(shù)字段進行校驗的場景,通常我們只能寫大量的if else來完成校驗工作,而如果使用SpringBoot Validation則可以輕松的通過注解來完成,接下來小編給大家介紹下利用SpringBoot?Validation快速實現(xiàn)數(shù)據(jù)校驗的示例代碼,需要的朋友參考下吧
    2022-06-06
  • spring-mybatis獲取mapper的四種方式匯總

    spring-mybatis獲取mapper的四種方式匯總

    這篇文章主要介紹了spring-mybatis獲取mapper的四種方式匯總,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot解決ajax跨域問題的方法

    SpringBoot解決ajax跨域問題的方法

    這篇文章主要為大家詳細介紹了SpringBoot解決ajax跨域問題的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 詳解JAVA設計模式之適配器模式

    詳解JAVA設計模式之適配器模式

    這篇文章主要介紹了JAVA設計模式之適配器模式的的相關資料,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解
    2020-06-06
  • Spring Boot打war包的實例教程

    Spring Boot打war包的實例教程

    本篇文章主要介紹了Spring Boot打war包的實例教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    這篇文章主要介紹了Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解,就是String,StringBuilder以及StringBuffer這三個類之間有什么區(qū)別呢,自己從網(wǎng)上搜索了一些資料,有所了解了之后在這里整理一下,便于大家觀看,需要的朋友可以參考下
    2023-12-12
  • @Autowired注入為null的原因與解決方法

    @Autowired注入為null的原因與解決方法

    我們經(jīng)常會通過@Autowired注解將某個類注到另一個類中,但是會發(fā)現(xiàn)注不進去,報NULL,所以本文就給大家分析了@Autowired 注入為null 的原因與解決方法,需要的朋友可以參考下
    2023-09-09
  • java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列

    java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列

    大家都知道LinkedBlockingQueue 隊列是BlockingQueue接口的實現(xiàn)類,所以它具有BlockingQueue接口的一切功能特點,他還提供了兩種構造函數(shù),本文中通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-06-06
  • java實現(xiàn)圖片滑動驗證(包含前端代碼)

    java實現(xiàn)圖片滑動驗證(包含前端代碼)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)圖片滑動驗證,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論

通渭县| 开封县| 鸡西市| 延庆县| 灌阳县| 武胜县| 湖州市| 辛集市| 沁阳市| 宜黄县| 瑞昌市| 永福县| 出国| 辛集市| 绵阳市| 改则县| 龙州县| 扎赉特旗| 玉屏| 贵州省| 安徽省| 松江区| 房产| 扎赉特旗| 尉犁县| 嘉荫县| 磐安县| 岐山县| 克山县| 博爱县| 齐河县| 阿坝县| 伊宁市| 岳阳市| 卢湾区| 类乌齐县| 福泉市| 滨州市| 铁岭市| 苏尼特左旗| 花莲市|