IT/PROGRAMMING

[Java] 클래스에 정의된 제너릭(generic) 타입의 Class를 얻는 방법

하마연구소장 2019. 2. 12. 23:40
728x90
반응형

자바에서 클래스를 정의할 때, 제너릭(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);
}
}


반응형