Map to Object 와 Object to Map

2013. 4. 23. 17:56 - 에릭투스

오늘은 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

다른 카테고리의 글 목록

자바 기본 공부/기초 이론 카테고리의 포스트를 톺아봅니다