自动生成包含类字段的地图

时间:2017-12-04 17:15:24

标签: java lombok

我有以下课程

@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();
  }

}

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您应该查看: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(在这种情况下Object中的map可以更改)。