2016-08-04 3 views
0

int getInt(String col), getFloat, getString, getDate, etc.과 같은 메소드를 사용하는 일종의 문서 객체 모델을 제공하고 클래스는 일반 공개 필드 또는 setName(String), setAge(int), etc.과 같은 공용 설정자를 시들게합니다. 내 문서 레코드를 지정된 Java 유형에 매핑하려고합니다.오브젝트 모델을 클래스로 매핑하는 Java

다양한 대형 JSON, SQL 등의 라이브러리를 사용하여 런타임에서 MyRecordObject.class이라고 말하면서 모든 종류의 스키마 파일을 사용하는 컴파일 타임 코드가 필요 없다는 것을 보았습니다.

하지만 어떻게 구현 되나요? 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

불행하게도 소스를 제어하지는 않습니다. 레거시 (그리고 약 6 개 레이어의 변형, 네트워크 전송 등)가있는 일부 엔터프라이즈 라이브러리에서 제공합니다. 아마도 JSON/XML로 변환 한 다음 다시 매핑 할 수는 있지만 낭비 적이기 때문에 이전의 코드 검토를 수동으로 수행하는 것보다 훨씬 쉽습니다. 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

더 높은 수준의 인터페이스가 없습니까? 나는 이것을 지상에서의 반영으로 생각했지만 복잡한 (필드 유형, 모든 필수 필드 검사, 예기치 않은 필드 확인 등) 및 많은 성능 튜닝 (조회/매핑 특성 등)이 필요할 것 같다. . 하나의 웹 서버 요청에 대한 10,000 개의 레코드에 대해 필드 당 레코드 당) –

+0

내가 아는 그런 고급 인터페이스는 없습니다. 리플렉션을 사용할 때 항상 성능이 저하됩니다. 특정 요구 사항이 있으며 특정 코드가 필요할 가능성이 큽니다. – GuiSim

관련 문제