gpt4 book ai didi

java - Java中获取类的字段名

转载 作者:行者123 更新时间:2023-12-02 01:25:35 24 4
gpt4 key购买 nike

我正在尝试以自动方式为 Java 中的类字段生成 CSV 映射,因为我需要多次使用它。

我有以下方法来尝试获取字段名称:(其中 CSV header 类似于“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 {

@Test
public 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||应从给定类别收集 Camel 箱元素。我尝试使用 Java Reflection API,正如我在几个示例中看到的那样,但我得到了一个奇怪的字符串输出。 (不是序列化的@randomCharsLikeName)。尝试了 toString() 和其他肮脏的技巧,但没有任何效果。

有人可以给我一点提示吗?或者至少告诉我是否可以做我尝试过的事情?提前致谢!

编辑:问题中提出的当前代码原型(prototype)在隔离环境(单独的新项目)中工作并显示预期输出。尽管它集成在我试图将其集成到的整个应用程序中,但它不起作用。我将继续研究并让您知道根本原因(在真实的应用程序中,我还在类(class)中使用 lombok (

@AllArgsConstructor, @NoArgsConstructor, @Data, @ToString

),但老实说,我并不认为这在使用反射时可能是一个问题)

最佳答案

我同时发现了这个问题。当我对生成器进行原型(prototype)设计时,我使用了:

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

产生类似 JAVA.LANG.REFLECT._FIELD|java.lang.reflect.Field||

的输出

因为我只是忘记了我实际上改进了它以使用实际的类对象作为函数的参数。在提出问题之前,我对代码做了一些声纳修复,但没有注意到我修复了一个警告以删除 .getClass() 方法调用,因为我已经传递了一个类(我认为它不会有所作为,因为这只是一个警告)。 每日道德提示 - 永远不要忽视警告。

因此,问题中提供的代码片段现在可以在一个独立的虚拟项目中正常工作,并且还可以使用固定行集成到一个更复杂的项目中:

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

另外,正如有人在评论中建议的那样,可以删除 field.setAccessible(true); ,因为它对于该方法的目的来说是无用的。

关于java - Java中获取类的字段名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com