안녕하세요, 하마연구소 입니다.
자바에서 클래스를 정의할 때, 제너릭(generic) 타입을 종종 사용하게 됩니다.
코딩을 하다보면 이 generic 타입이 어떤 클래스인지 알아야할 때가 있죠.
방법은 자바 리플렉션을 이용하면 됩니다.
아래와 같이 ClassUtil
클래스에 2개 메서드를 작성하였습니다.getGenericTypsClasses()
메서드는 generic 타입을 얻기위한 핵심 코드이며, 복수개로 정의된 generic 타입을 위하여 리스트로 반환합니다.getGenericTypsClass()
메서드는 원하는 위치(index)의 generic 타입을 얻기위하여 작성하였습니다.
public class ClassUtil {
/**
* 클래스에 정의된 generic 타입의 Class를 얻는다.
* @param clazz 클래스
* @return Generic 타입의 Class 리스트
*/
public static List<Class<?>> getGenericTypsClasses(Class<?> clazz) {
// 클래스에 정의된 generic 파라미터에서 클래스 얻기
Type[] genericTypes = ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments();
return Arrays.stream(genericTypes)
.map(genericType -> {
try {
Class<?> genericClass = Class.forName(genericType.getTypeName());
return genericClass;
} catch (Exception e) {
throw new MediaRuntimeException(e);
}
})
.collect(Collectors.toList());
}
/**
* 클래스에 정의된 generic 타입의 Class를 얻는다.
* @param clazz 클래스
* @param index Generic 타입 정의 index
* @return Generic 타입의 Class
*/
public static Class<?> getGenericTypsClass(Class<?> clazz, int index) {
List<Class<?>> genericTypeList = ClassUtil.getGenericTypsClasses(clazz);
return genericTypeList.get(index);
}
}
지금까지 런타임 시에 generic 타입에 실제 어떤 클래스가 들어왔는지 확인해보는 방법이었습니다.
감사합니다.