Languages/Java2010.09.02 16:20
Java의 Reflection을 사용하면 속도는 뭐 그저 그럴지 모르지만 귀찮은 작업이 줄어들 때가 있습니다. 가령 어떤 객체의 모든 필드와 그 값의 쌍을 Map 객체 안에 저장하고 싶다거나 할때 특히 유용하죠. (그 역방향 작업이 필요할 때도 있겠죠.)

그런 작업이 필요할 때 어떤 코드를 작성하면 되는지 보시면...


import java.lang.reflect.Field;

import java.util.HashMap;

import java.util.Map;



class A {

private String p;

private String q;

A() {

p = "foo";

q = "bar";

}

public String getP() {

return p;

}


public String getQ() {

return q;

}


public Map<String, Object> toMap() {

Field[] fields = this.getClass().getDeclaredFields();

Map<String, Object> ret = new HashMap<String, Object>();

for ( int i = 0; i < fields.length; ++i ) {

try {

ret.put(fields[i].getName(), fields[i].get(this));

} catch (IllegalArgumentException e) {

e.printStackTrace();

return null;

} catch (IllegalAccessException e) {

e.printStackTrace();

return null;

}

}

return ret;

}

}



public class Test {


/**

* @param args

*/

public static void main(String[] args) {

A a = new A();

Map<String, Object> r = a.toMap();

for ( String s : r.keySet() ) {

Object o = r.get(s);

System.out.println("key:" + s + ", value:" + o.toString());

}

}


}


뭐 보시다시피 별로 어렵지는 않습니다. 그런데 이런 코딩이 대체 언제 필요하느냐...

XML-RPC 위에서 API를 구현한다거나 할 때 유용하죠. ㅋㅋ XML-RPC의 struct 타입을 Apache XML-RPC 라이브러리에서는 Map Object 형태로 처리하거든요.

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 는 뭐 그저 그럴지 모르지만 귀찮은 작업이 줄어들 때가 있습니다. 가령 어떤 객체의 모든 필드와 그 값의 쌍을 Map 객체 안에 저장하고 싶다거나 할때 특히 유용하죠. (그 역방향 작업이 필요할 때도 있겠죠.)

    2010.09.29 14:19 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 푸른컴돌

    Reflection을 사용하면 속도상의 손해를 많이 보나요?

    2011.10.05 13:58 신고 [ ADDR : EDIT/ DEL : REPLY ]