Monday, January 30, 2012

Generic Parameter instantiation discovery with Java Reflection


Consider the following scenario:




class A<T> {}
class B extends A<Integer> {}



How can I know through reflection in Java that in B , the T type variable was instantiated as an Integer ?

1 comment:

  1. You can use

    Type type = B.class.getGenericSuperclass();

    // TODO: check with instanceof first?
    ParameterizedType parameterized = (ParameterizedType) type;

    // TODO: Check that there *are* type arguments
    Type firstTypeArgument = parameterized.getActualTypeArguments()[0];


    Short but complete example:

    import java.lang.reflect.*;

    class A<T> {}
    class B extends A<Integer> {}

    public class Test {
    public static void main(String[] args) {
    Type type = B.class.getGenericSuperclass();
    ParameterizedType parameterized = (ParameterizedType) type;
    // Prints class java.lang.Integer
    System.out.println(parameterized.getActualTypeArguments()[0]);
    }
    }

    ReplyDelete