오늘은 java Reflection에 대해 알아보자!!
솔직히 요즘 회사에서 잉여 잉여~ 걸리면 디짐.. -ㅅ-b
암튼, Manager개발이 궁금해서 Java 기초 이론을 좀 보는 중이다..
Object(보통 POJO기반의 get/set메소드가 있는 객체)를 사용하다가 이것을 Map으로 변경하려면??
물론 노가다로 만들어도 되지만... 이는 귀찮다....
UserVO vo = getUserVO();
Map map = new HashMap();
map.put("name",vo.getName());
.....
그래서 Object를 Map으로 변경해주는 ObjectUtil!! 을 만등러보장!!
public static Map ConverObjectToMap(Object obj){ try { //Field[] fields = obj.getClass().getFields(); //private field는 나오지 않음. Field[] fields = obj.getClass().getDeclaredFields(); Map resultMap = new HashMap(); for(int i=0; i<=fields.length-1;i++){ fields[i].setAccessible(true); resultMap.put(fields[i].getName(), fields[i].get(obj)); } return resultMap; } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; }
참 간단하다.. 핵심은
1. getDeclaredFields()를 통해 선언되어있는 필드를 가져온후 Loop돌며
2. Field.setAccessible(true)를 통해 private 필드접근을 가능하도록 한다.
3. 그담엔? 필드명을 Key로하고 값을 저장하여 Map을 뱉어내면 끝~!!
이번엔 반대로
Map으로 사용하던 데이터를 Object(보통 POJO기반의 get/set메소드가 있는 객체)로 변환 하고 싶으면?? 어떡하나?
public static Object convertMapToObject(Map map, Object objClass){ String keyAttribute = null; String setMethodString = "set"; String methodString = null; Iterator itr = map.keySet().iterator(); while(itr.hasNext()){ keyAttribute = (String) itr.next(); methodString = setMethodString+keyAttribute.substring(0,1).toUpperCase()+keyAttribute.substring(1); try { Method[] methods = objClass.getClass().getDeclaredMethods(); for(int i=0;i<=methods.length-1;i++){ if(methodString.equals(methods[i].getName())){ System.out.println("invoke : "+methodString); methods[i].invoke(objClass, map.get(keyAttribute)); } } } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return objClass; }
쪼까 길다.. 근데 까보면 별거없다..
1. Map의 key만큼 Loop를 돌며 + key값의 첫번째 글자를 대문자로 바꾼다.(보통 name이라는 필드가 있다면 set메소드는 setName 이니까)
2. 넘긴 POJO의 선언된 Method를 가져와서 우리가 필요한(set할) 메소드를 찾는당
3. 메소드 실행하며 값을 넘겨준다~ (invoke)
4. 끝~
실행 예제를 보자~ (위 함수는 ObjectUtil 클래스에 정의되어있다..)
'자바 기본 공부 > 기초 이론' 카테고리의 다른 글
Effective 자바 - 개초보가 본디.. (1) | 2013.04.01 |
---|---|
Java Thread Pool 예제 (0) | 2013.03.25 |
Java Annotation 기초(Basic) (0) | 2012.12.24 |
OracleDataSource를 사용한 JDBC 기초이론 (0) | 2009.06.23 |
자바 JDBC 기초 (0) | 2009.06.23 |