2016-08-04 217 views
0

给定某种类型的文档对象模型,其中包含类似int getInt(String col), getFloat, getString, getDate, etc.的方法,以及类干枯的纯公共字段或公共设置程序(如setName(String), setAge(int), etc.)我想将我的文档记录映射到指定的Java类型。Java将对象模型映射到类

我已经看到,在运行时只使用MyRecordObject.class就可以完成各种大型JSON,SQL等库的工作,没有编译时代码使用任何类型的模式文件。

但是这是如何实现的? Java是否具有用于表示DOM /记录结构并将其映射到特定Java类的某种低级接口?

//to create something like this 
Record record = readRecordFromMyGenericFileFormat(); 
TodoItem todo = record.as(TodoItem.class); 
+0

对于其中一些库,您可以查看[源代码](https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/Gson.java )。但这很可能是通过反思完成的。即查看json的键名,并在传递的类中查找相应的字段。 –

+0

不是将DOM映射到对象,而是考虑将DOM的源映射到对象,或许将XML映射到对象。 – DwB

+0

不幸的是,我们不能控制源代码,它由一些企业库提供了大量的遗留代码(以及大约六层转换,网络传输等)。我可以将它转换为JSON/XML,然后将其映射回去,但这看起来很浪费,而且我不可能在过去的代码审查中获得过去的代码审查,即使是100年代的手动'todo.setDate(record.getDate(“date”))', –

回答

0

一般的想法是使用反射动态设置类的实例中的字段的值。

Apache BeanUtils可能是有用的,并为您节省一些麻烦。 Example

Employee employee = ...; 
PropertyUtils.setSimpleProperty(employee, "firstName", firstNameValue); 
PropertyUtils.setSimpleProperty(employee, "lastName", lastNameValue); 

你必须从你的通用文件格式读取的字段名称("firstName")和价值(firstNameValue)。

如果字段名称信息在您的文件格式中不可用,则可能通过反射动态获取字段可能适用于您的用例。 在线有Java Reflection有多个高质量的教程。

+0

没有更高层次的界面?我考虑从底层开始反思,但看起来像很复杂(字段类型,检查所有必填字段,检查没有意外的字段等),并可能需要大量的性能调整(查找/映射属性等。对于单个Web服务器请求,每条记录每个记录10,000条记录) –

+0

没有我知道的更高级别的接口。使用反射时性能总是会受到影响。你有特定的需求,很可能需要特定的代码。 – GuiSim