JAVA

[JAVA] 객체 클래스 타입에 관계없이 처리하기 - Reflection

pocket.quokka 2022. 3. 30. 15:31

배경: 파라미터로 받는 vo의 종류에 상관 없이 동작할 수 있는 모듈 필요

Reflection을 활용하여 해결

 

1) field

for(Field field : vo.getClass().getSuperclass().getDeclaredFields()) {
        field.setAccessible(true);
        String fieldName = field.getName();
        Object value = field.get(vo);
}

* getSuperclass()를 제외해도 되나, 나의 경우에는 파라미터로 전달 받은 vo에 enhancercglib가 같이 껴들어와서 순수 vo 객체 정보만 가져오기 위해서 getSuperclass() 사용했다.

* 파라미터로 전달받은 vo object에 list도 포함되어 있었는데, 분명 값이 있는데 null 값을 가져왔다. 다른 String 형태 값들은 문제 없이 값을 가져왔으나 list의 경우에만 이런 문제가 발생했다. 그런데 디버깅 걸어서 잠시 멈춘 후에 진행하면 값이 정상적으로 넘어왔다. 이유를 추측하자면 reflection의 경우 수행 시간이 좀 긴데, list 값 전체를 가져오기 전에 빈 값(null)을 가져온게 아닌가라고 추측하고 있다. 해결은 못했다. 그래서 아래에 있는 2번 방법을 사용했다.

 

2) method

필드값 대신에 getter, setter 등을 포함하는 메서드들을 불러오는 방법을 선택했다.

static public Map<String, Object> convertObjectToMap(Object vo, Object objectClass) {
    Map<String, Object> map = new HashMap<>();

    try {
        for(Method method : objectClass.getClass().getDeclaredMethods()) {
            String methodName = method.getName();
            if(methodName.startsWith("get")) {
                String key = methodName.substring(3,4).toLowerCase() + methodName.substring(4);
                Object value = method.invoke(vo);
                map.put(key, value);
            }
        }

    } catch(Exception e) {
        e.printStackTrace();
    }

    return map;
}

* 메서드를 불러오는 것이기 때문에 필드값에 대한 정보는 없다. 그래서 getter 메서드에서 필드명을 추출했다.

* 이 경우에는 list값도 문제 없이 불러와졌다.