猿问

获取Java中类的字段名称

我正在尝试以自动方式为 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 {


@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|| 应该从给定类中收集骆驼装箱物品的地方。正如我在几个示例中看到的那样,我尝试使用 Java Reflection API,但我得到了一个奇怪的 String 输出。(不是序列化的@randomCharsLikeName)。尝试了 toString() 和其他肮脏的技巧,但没有任何效果。


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


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


@AllArgsConstructor、@NoArgsConstructor、@Data、@ToString


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


慕尼黑8549860
浏览 266回答 1
1回答

喵喵时光机

同时我发现了这个问题。当我对生成器进行游戏原型设计时,我使用了:csvBuilder.append(field.getClass().getName().replaceAll("(.)(\\p{Upper})",&nbsp;"$1_$2").toUpperCase());产生了类似的输出JAVA.LANG.REFLECT._FIELD|java.lang.reflect.Field||因为我只是忘记了我实际上改进了它以使用实际的类对象作为函数的参数。在问这个问题之前,我对代码进行了一些 Sonar 修复,但没有注意到我修复了 WARN 以删除方法.getClass()调用,因为我已经传入了一个类(我认为这不会有什么不同,因为它只是一个警告)。每日道德提示——永远不要忽视警告。因此,问题中提供的代码片段现在可以在一个孤立的虚拟项目中正常工作,并且还可以使用固定行集成到一个更复杂的项目中:csvBuilder.append(field.getName().replaceAll("(.)(\\p{Upper})",&nbsp;"$1_$2").toUpperCase());同样正如有人在评论中建议的那样,field.setAccessible(true);可以删除它,因为它对于该方法的目的是无用的。
随时随地看视频慕课网APP

相关分类

Java
我要回答