2016-08-04 258 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