[java] Java 객체 (Bean)를 키-값 쌍으로 (또는 그 반대로) 변환하는 방법은 무엇입니까?

getXXX 및 setXXX 속성 만있는 매우 간단한 Java 개체가 있다고 가정 해 보겠습니다. 이 개체는 기본적으로 레코드 또는 형식 안전 (및 성능) 맵과 같은 값을 처리하는 데만 사용됩니다. 나는 종종이 객체를 키 값 쌍 (문자열 또는 형식 안전)으로 변환하거나 키 값 쌍에서이 객체로 변환해야합니다.

이 변환을 수행하기 위해 리플렉션 또는 수동으로 코드를 작성하는 것 외에이를 달성하는 가장 좋은 방법은 무엇입니까?

예를 들어 ObjectMessage 유형을 사용하지 않고 (또는 수신 메시지를 올바른 유형의 객체로 변환하지 않고) jms를 통해이 객체를 보낼 수 있습니다.



답변

항상 apache commons beanutils가 있지만 물론 후드 아래에서 반사를 사용합니다.


답변

많은 잠재적 솔루션이 있지만 하나만 더 추가하겠습니다. 사용 잭슨 (JSON 처리 lib 디렉토리)처럼, “JSON없는”변환을 수행합니다 :

ObjectMapper m = new ObjectMapper();
Map<String,Object> props = m.convertValue(myBean, Map.class);
MyBean anotherBean = m.convertValue(props, MyBean.class);

( 이 블로그 항목 에는 더 많은 예제가 있습니다)

기본적으로 호환되는 모든 유형을 변환 할 수 있습니다. 호환 됨은 유형에서 JSON으로 변환하고 해당 JSON에서 결과 유형으로 변환하면 항목이 일치 함을 의미합니다 (제대로 구성된 경우 인식되지 않는 항목을 무시할 수도 있음).

지도, 목록, 배열, 프리미티브, 빈과 같은 POJO를 포함하여 예상되는 경우에 잘 작동합니다.


답변

코드 생성은 제가 생각할 수있는 유일한 다른 방법입니다. 개인적으로 저는 일반적으로 재사용 가능한 리플렉션 솔루션을 얻었습니다 (코드의 일부가 성능에 절대적으로 중요하지 않은 경우). JMS를 사용하는 것은 과잉처럼 들립니다 (추가적인 종속성, 그것이 의미하는 바도 아닙니다). 게다가, 아마도 후드 아래에서도 반사를 사용합니다.


답변

Java 객체를 Map으로 변환하는 방법입니다.

public static Map<String, Object> ConvertObjectToMap(Object obj) throws
    IllegalAccessException,
    IllegalArgumentException,
    InvocationTargetException {
        Class<?> pomclass = obj.getClass();
        pomclass = obj.getClass();
        Method[] methods = obj.getClass().getMethods();


        Map<String, Object> map = new HashMap<String, Object>();
        for (Method m : methods) {
           if (m.getName().startsWith("get") && !m.getName().startsWith("getClass")) {
              Object value = (Object) m.invoke(obj);
              map.put(m.getName().substring(3), (Object) value);
           }
        }
    return map;
}

이것은 그것을 부르는 방법입니다

   Test test = new Test()
   Map<String, Object> map = ConvertObjectToMap(test);


답변

아마 파티에 늦었을 것입니다. Jackson을 사용하여 속성 개체로 변환 할 수 있습니다. 이것은 중첩 된 클래스와 abc = value에 대한 키를 원하는 경우에 적합합니다.

JavaPropsMapper mapper = new JavaPropsMapper();
Properties properties = mapper.writeValueAsProperties(sct);
Map<Object, Object> map = properties;

접미사를 원하면

SerializationConfig config = mapper.getSerializationConfig()
                .withRootName("suffix");
mapper.setConfig(config);

이 종속성을 추가해야합니다.

<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-properties</artifactId>
</dependency>


답변

Java 8을 사용하면 다음을 시도 할 수 있습니다.

public Map<String, Object> toKeyValuePairs(Object instance) {
    return Arrays.stream(Bean.class.getDeclaredMethods())
            .collect(Collectors.toMap(
                    Method::getName,
                    m -> {
                        try {
                            Object result = m.invoke(instance);
                            return result != null ? result : "";
                        } catch (Exception e) {
                            return "";
                        }
                    }));
}


답변

예를 들어 XStream + Jettison을 사용하는 JSON 은 키 값 쌍이있는 간단한 텍스트 형식입니다. 예를 들어 다른 플랫폼 / 언어와의 Java 개체 교환을 위해 Apache ActiveMQ JMS 메시지 브로커에서 지원합니다.