java - 自动生成包含类字段的映射

标签 java lombok

我有以下类(class)

@Data
public class CMC{

  String f1;
  String f2;
  String f3;      
  public Map<String, Supplier<String>> valuesMap() {
    return ImmutableMap.<String, Supplier<String>>builder()
        .put("f1", this::f1)
        .put("f2", this::f2)
        .put("f3", this::f3)
        .build();
  }

}

正如您所看到的,我有一些字段和一个映射,其中包含指向返回该字段值的函数的每个字段。

此解决方案的问题在于,开发人员可能会到达这里并添加新字段,但忘记将其添加到 map 中。

有没有办法自动化这个过程?

我希望像 lombok 这样的东西可以帮助我解决这个问题。需要类中的字段列表并访问它们的值是很常见的事情。

为了解决这个问题,我会创建一个注释,然后以某种方式使用反射来获得我想要的行为,但我认为类似的东西已经在某些工具中实现了。

最佳答案

您应该查看:Class::getDeclaredFields ; Class::getSuperclass ;和 Field 。在一起,他们应该能够得到你正在寻找的东西......比如:

final Map<String, Object> map = new HashMap<>();
Class<?> klass = this.getClass();
while (klass != null) {
    for (final Field field : klass.getDeclaredFields()) {
        if (!field.isAccessible()) {
            field.setAccessible(true);
        }
        map.put(field.getName(), field.get(this));
    }
    klass = klass.getSuperclass();
}

您需要处理异常,确定在哪里调用它,并确认是否要对所有字段(私有(private)等)或只是一些,是否将值延迟缓存在某处,以及是否所有内容都需要转换为 String (在这种情况下,map 中的 Object 可以更改)。

关于java - 自动生成包含类字段的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47638582/

相关文章:

java - 无法忽略 lombok 注释 - Sonarqube

java - 如何从 application.yml 文件注入(inject)属性?

java - java中有没有类似于StringBuilder的类,唯一的区别就是它的长度是固定的?

java - AspectJ - 无法注册非方面错误

java - Iterator<elementType> it =myCollection.Iterator();刚开始编程,想知道这意味着什么?

java - Spring http/web 转发不适用于 spring-reactive

java - 使用 lombok @RequiredArgsConstructor(onConstructor = @__(@Autowired)) 时,Mockito when().thenReturn() 的行为不符合预期

java - Controller 中扩展抽象 Controller 的方法的自定义注释

maven - JsonIgnore 注释不适用于 Lombok

java - Lombok:单一构建器和默认值