亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取Java中類的字段名稱

獲取Java中類的字段名稱

慕尼黑8549860 2023-06-14 16:15:05
我正在嘗試以自動方式為 Java 類的字段生成 CSV 映射,因為我需要多次使用它。我有以下嘗試獲取字段名稱的方法:(其中 CSV 標頭類似于“DB_NAME|FIELD_NAME|ADDITIONAL_F1|ADDITIONAL_F2”)package util;import java.lang.reflect.Field;public class CsvAttributesMappingGenerator {public static String generateCsvAttributesMapping(Class<?> model) {    StringBuilder csvBuilder = new StringBuilder();    Field[] fieldList = model.getDeclaredFields();    for (Field field : fieldList) {        //field.setAccessible(true);        csvBuilder.append(field.getName().replaceAll("(.)(\\p{Upper})", "$1_$2").toUpperCase());        csvBuilder.append("|");        csvBuilder.append(field.getName());        csvBuilder.append("||\n");    }    return formatOutput(csvBuilder.toString());}private static String formatOutput(String classText) {    String delimiter = "\n******************************\n";    return String.format("%s%s%s", delimiter, classText, delimiter);}}和一個測試電話,例如:import objects.User;import org.junit.Test;import util.CsvAttributesMappingGenerator;public class CsvAttributesMappingGeneratorTest {@Testpublic void testGenerationWithObject() {    System.out.println(CsvAttributesMappingGenerator.generateCsvAttributesMapping(User.class));}}要解析的對象具有以下結構:包對象;public class User {private String userName;private String userEmail;private int userAge;private String otherDetails;// getters, setters and all args constuctor here}輸出應包含多行,如 FIELD_NAME|fieldName|| 應該從給定類中收集駱駝裝箱物品的地方。正如我在幾個示例中看到的那樣,我嘗試使用 Java Reflection API,但我得到了一個奇怪的 String 輸出。(不是序列化的@randomCharsLikeName)。嘗試了 toString() 和其他骯臟的技巧,但沒有任何效果。有人可以給我小費嗎?或者至少告訴我是否可以做我嘗試過的事情?提前致謝!編輯:問題中提供的當前代碼原型在隔離環境(單獨的新項目)中工作并顯示預期輸出。雖然它集成在我試圖將其集成到的整個應用程序中,但它不起作用。我會繼續研究并讓你知道根本原因(在真正的應用程序中我也使用 lombok 作為類(@AllArgsConstructor、@NoArgsConstructor、@Data、@ToString), 但老實說我不認為這在使用反射時可能是個問題)
查看完整描述

1 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

同時我發現了這個問題。當我對生成器進行游戲原型設計時,我使用了:

csvBuilder.append(field.getClass().getName().replaceAll("(.)(\\p{Upper})", "$1_$2").toUpperCase());

產生了類似的輸出JAVA.LANG.REFLECT._FIELD|java.lang.reflect.Field||

因為我只是忘記了我實際上改進了它以使用實際的類對象作為函數的參數。在問這個問題之前,我對代碼進行了一些 Sonar 修復,但沒有注意到我修復了 WARN 以刪除方法.getClass()調用,因為我已經傳入了一個類(我認為這不會有什么不同,因為它只是一個警告)。每日道德提示——永遠不要忽視警告。

因此,問題中提供的代碼片段現在可以在一個孤立的虛擬項目中正常工作,并且還可以使用固定行集成到一個更復雜的項目中:

csvBuilder.append(field.getName().replaceAll("(.)(\\p{Upper})", "$1_$2").toUpperCase());

同樣正如有人在評論中建議的那樣,field.setAccessible(true);可以刪除它,因為它對于該方法的目的是無用的。


查看完整回答
反對 回復 2023-06-14
  • 1 回答
  • 0 關注
  • 302 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號