[java] 런타임 시점에서의 제네릭 타입 확인하기

자바에서는 제네릭 타입이 런타임에는 소거됩니다. 따라서 런타임에 제네릭 타입을 확인해야 하는 경우가 종종 있습니다. 이런 경우, reflection(리플렉션)을 사용하여 제네릭 타입을 확인할 수 있습니다.

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericClass<T> {
    private Class<T> type;

    public GenericClass() {
        Class<?> clazz = getClass();
        if (clazz.getGenericSuperclass() instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
            Type[] typeArguments = parameterizedType.getActualTypeArguments();
            if (typeArguments.length > 0 && typeArguments[0] instanceof Class) {
                type = (Class<T>) typeArguments[0];
            }
        }
    }

    public Class<T> getType() {
        return type;
    }
}

위의 코드는 ParameterizedType을 사용하여 런타임 시점에서 제네릭 타입을 확인하는 예제입니다.

이제 GenericClass를 상속받는 클래스에서 getType() 메서드를 호출하면 그 클래스의 제네릭 타입을 확인할 수 있습니다.

public class StringGenericClass extends GenericClass<String> {
    public static void main(String[] args) {
        StringGenericClass stringGenericClass = new StringGenericClass();
        System.out.println(stringGenericClass.getType());  // 출력: class java.lang.String
    }
}

이렇게 하면 런타임 시점에서 제네릭 타입을 확인할 수 있으며, 이를 통해 동적으로 제네릭 타입을 다루는 코드를 작성할 수 있습니다.

참고 자료