我有以下课程
@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这样的东西来帮助我解决这个问题。需要一个类的字段列表并且可以访问它们的值是很常见的。
要解决这个问题,我会创建一个注释,然后以某种方式使用反射来获得我想要的行为,但我想在某些工具中已经实现了类似的东西。
答案 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
可以更改)。