[회사일] Generic 타입 추론 유틸 만들기
@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 마무리하러 가야겠습니다.