Java Bean
을 Map
으로 변환하려고했습니다. 인터넷에는 많은 자원이 있지만, 불행히도 그들은 모두 간단한 콩을지도로 변환하는 것을 다룹니다. 내 것들은 조금 더 광범위합니다.지도에 Java Bean 병합
간단한 예있다 :
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
내 요점은이 경우, 다음 조건에 해당하는, Map<String, Object>
을 생산하는 것입니다 :
map.containsKey("firstName")
map.containsKey("lastName")
map.containsKey("homeAddress.street") // street is String
map.containsKey("homeAddress.number") // number is int
map.containsKey("homeAddress.city") // city is String
map.containsKey("homeAddress.zipcode") // zipcode is String
map.containsKey("age")
나는 시도 Apache Commons BeanUtils
를 사용하여. BeanUtils#describe(Object)
과 BeanMap(Object)
두 접근법은 "딥 레벨"이 1 인지도를 생성합니다. 즉, 값이 MyHomeAddress
인 객체는 "homeAddress"
키만 존재합니다. 내 메서드는 기본 형식 (또는 문자열)을 충족 할 때까지 개체를 더 깊숙하고 깊게 입력해야합니다. 그런 다음 파지를 중지하고 키를 삽입해야합니다 (예 : "order.customer.contactInfo.home"
).
내 질문은 : 어떻게 그것을 easliy 할 수 있습니다 (또는 내가 할 수있는 이미 기존의 프로젝트가 있습니까)? 다음은 간단한 반사/재귀 예입니다
private static boolean isValue(Object value) {
final Class<?> clazz = value.getClass();
if (value == null ||
valueClasses.contains(clazz) ||
Collection.class.isAssignableFrom(clazz) ||
Map.class.isAssignableFrom(clazz) ||
value.getClass().isArray() ||
value.getClass().isEnum()) {
return true;
}
return false;
}
"원시"는 원시 (객체를 확장)가 아니기 때문에 아마 "원시"를 의미하지는 않습니다. 따라서 어떤 클래스가 트래버스 할 것인지, 어떤 클래스를 값으로 사용할 것인지 알고리즘에 알리는 방법이 필요합니다. 따라서 일종의 구성 (어쩌면 어노테이션 사용)없이이 작업을 수행하는 방법은 없을 것입니다. – Tonio
이것은 리플렉션과 재귀를 통해 수행 할 수 있습니다. 거의 확실하게 직접 작성해야합니다. 현재 라이브러리 권장 사항을 묻는 질문은 주제와 다르기 때문에 질문을 닫을 수 있습니다. – Radiodef
Tonio, Radiodef - 귀하의 제안에 감사드립니다, 나는 내 게시물을 편집했습니다. –