我有以下类(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/