我有一个拥有数百个字段的Java bean,每个字段都可以递归地与字段和更多子bean不同。我的问题是我需要从具有字段名称/值对的平面文件中加载值,但我没有该字段的完全限定名称。
假设我有类A和B.A包含B的实例,B包含名为f
的字符串字段,它存储值s
。如果每个类的实例只是小写的类名,则此数据结构中f
的完全限定名称为a.b.f
实际上,我需要做一些如下所示的事情,因为我从文件中读取了字段名称,所以我实际上只使用了反射。
... a.getB()SETF(X)。 //这是一个过于简单化的如果a.b为null,我还需要创建并分配B的实例。
然而,我真正希望能做的是一个简单的a.setF(s)。
假设所有bean中没有重复字段,我如何生成扁平bean并在两者之间进行转换?
一位同事提到Dozer,听起来它可以用于从扁平bean格式转换为分层bean格式,但看起来我仍然需要生成扁平bean和映射。由于有数百个字段和数十个bean,这绝对是我不想手动完成的。
答案 0 :(得分:0)
我认为你的扁平化问题可以在这些步骤中解决
Map<String, String>
加载到内存中。通常的java Properties
可用于此目的。builder
)。例如。为此自动创建BeanMappingBuilder
。 DozerBeanMapper mapper = new DozerBeanMapper();
mapper.addMapping(builder);
HugeDestinationalBean result = mapper.map(properties, HugeDestinationalBean.class);
此处HugeDestinationalBean
是您的目标bean。
显然,最棘手的部分是第2步。它的实现取决于源数据文件中的常规字段命名和目标bean的结构。
或者,在通常的Java Reflection的基础上手动实现步骤2。