본문 바로가기

java

generic 타입 추론.

Generic 타입 추론 유틸 만들기

프로젝트/SLT : 2010/06/11 12:23



@Transactional
public class GenericServiceImpl<D extends GenericDao<E, S>, E, S> implements GenericService<E, S> {

    @Autowired ApplicationContext applicationContext;
    private Class<D> daoClass;
    protected D dao;

    public GenericServiceImpl(){
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        Type type = genericSuperclass.getActualTypeArguments()[0];
        if (type instanceof ParameterizedType) {
            this.daoClass = (Class<D>) ((ParameterizedType) type).getRawType();
        } else {
            this.daoClass = (Class<D>) type;
        }
    }

...
}

지난 번에 작성했던 GenericService 코드입니다. 여기서 저 가운데 부분이 GenericDao나 GenericController에서 사용될 가능성이 높습니다. 사실 지금 GenericController를 작성하던 중이었는데 타입 추론할께 하두 많아서;; @_@  유틸로 빼고 있습니다.

구현은 간단합니다.

public class GenericUtils {

    public static Class getClassOfGenericTypeIn(Class clazz, int index){
        ParameterizedType genericSuperclass = (ParameterizedType) clazz.getGenericSuperclass();
        Type wantedClassType = genericSuperclass.getActualTypeArguments()[index];
        if (wantedClassType instanceof ParameterizedType) {
            return (Class) ((ParameterizedType) wantedClassType).getRawType();
        } else {
            return (Class) wantedClassType;
        }
    }

}

테스트도 해봐야겠죠.

public class GenericUtilsTest {

    @Test
    public void testGetClassOfGenericTypeIn() throws Exception {
        Class<String> stringClass = GenericUtils.getClassOfGenericTypeIn(SampleClass.class, 0);
        assertThat(stringClass.toString(), is("class java.lang.String"));

        Class<Map> mapClass = GenericUtils.getClassOfGenericTypeIn(SampleClass.class, 1);
        assertThat(mapClass.toString(), is("interface java.util.Map"));
    }

    class SampleGenericClass<S, M>{}
    class SampleClass extends SampleGenericClass<String, Map> {}
}

잘 되는군요. GenericController 마무리하러 가야겠습니다.


'java' 카테고리의 다른 글

변경불가 리스트 만들기 Collections.unmodifiableList  (0) 2015.06.25
is a has a  (0) 2015.05.15
ThreadLocal  (0) 2015.02.25
isAssignableFrom  (0) 2014.12.20
StringUtils  (0) 2014.12.19