2009년 12월 28일 월요일

Generic 정보를 Reflection으로 알아내기

최근에 JDK1.5로 개발을 할 기회가 생겼다. 근무하던 사이트의 JDK 버전이 1.4 였기 때문에 처음 접하는 JDK 1.5  버전은 무척이나 생소했다.

 

1.5에서 새로 도입된 기술로 Generic, Annotation, Enum 정도가 대표적이라고 생각한다. 그리고 이 기술은 첨 볼때 무척이나 생소하게 느껴졌다. 현재는 이러한 기술들로 개발을 진행하면서 참 편하다고 생각이 든다. java.sun.com 의 튜토리얼보다 더 잘 정리할 자신은 없지만 각각의 주제에 대하여 간단한 글을 써야 되겠다는 계획을 현재 가지고 있다.

 

일단 글을 읽으시는 분들이 Generic에 대하여 익숙하하다고 가정하고, 요 몇일간 내가한 시간낭비의 결과를 간략하게 적으려고한다.

 

한마디로 요약하면 Generic 정보를 Reflection을 이용하여 Run-time에 알아낼 수 있는 방법이 있을까 하는 점이다.

 

List <String> srtList = new ArrayList<String>();

 

위의 형태로 정의된 필드에서 "String"을 알아낼 수 있는 방법이 없을까 하는 것이 고민이었다.

 

결론도 한마디로 정의 하면 "안된다"이다. 부끄럽게도 Generic 튜토리얼에 Type Erasure 라는 개념으로 설명이 되어 있었다. 말은 어렵지만 결국 Generic을 지원하는 Java 버전과 지원하지 않는 Java Version의 호환을 위하여 컴파일할때 Generic 정보는 모두 지운다는 의미이다. 지워진 정보를 Run-time에서 찾으려고 시도를 하니 안되는 것이 당연하다. 하지만 우리에게는 Annotation이 있다. 그래서 최종적으로 해결한 소스는 다음과 같다.

 

@SampleAnnotation( class = "java.lang.String")

List <String> srtList = new ArrayList<String>();

 

이렇게 정의하고 Annotation을 다음과 같이 정의 하면 원하는 로직을 구현 할 수 있다.

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SampleAnnotation{
 String class();
}

 

 

댓글 없음:

댓글 쓰기