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

