如何獲取java類中的屬性注釋
獲取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)文章
Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解
這篇文章主要介紹了Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解,請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向,但二者是完全不同的,所以我們今天就來盤他們的區(qū)別介紹,需要的朋友可以參考一下2022-07-07SpringBoot?錯(cuò)誤頁面跳轉(zhuǎn)方式
這篇文章主要介紹了SpringBoot?錯(cuò)誤頁面跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringCloud?hystrix斷路器與局部降級(jí)全面介紹
什么是服務(wù)降級(jí)?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁面有策略的不處理或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作2022-10-10mybatis關(guān)系映射之一對(duì)多和多對(duì)一
今天小編就為大家分享一篇關(guān)于mybatis關(guān)系映射之一對(duì)多和多對(duì)一,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作
這篇文章主要介紹了DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02SpringBoot設(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生命周期梳理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11