Java Generics: доступ к общему типу во время выполнения

Я хочу получить доступ к универсальному типу объявленного поля во время выполнения. Раньше у меня сложилось впечатление, что это невозможно из-за стирания типа Java. Однако этого не должно быть, потому что некоторые известные платформы используют универсальный тип посредством отражения во время выполнения.

Например, Guice реализует Provider на основе предоставленного вами универсального типа:

public class Injectable{

    @Inject
    private Provider someTypeProvider;

}

Как получить доступ к универсальному атрибуту SomeType поля или любому такому типу/методу/и т. д. через API отражения?

Кроме того, было бы полезно также знать, как получить доступ к этим атрибутам универсального типа через API процессора аннотаций Java 6.

Спасибо.

Редактировать:

Спасибо всем за отличные советы. Я нашел способ сделать это, используя ссылки Хайлема, в частности ссылку на статью Пренкова Java Reflection: Generics.

Вот ответ, который я искал:

/**
 * @author John Ericksen
 */
public class TypeReflectionExample {

    public class SomeType{}

    public class Injectable{
        @Inject  private Provider someTypeProvider;
    }

    public static void main(String[] args){

        try {
            Field providerField = Injectable.class.getDeclaredField("someTypeProvider");

            Type genericFieldType = providerField.getGenericType();

            if(genericFieldType instanceof ParameterizedType){
                ParameterizedType aType = (ParameterizedType) genericFieldType;
                Type[] fieldArgTypes = aType.getActualTypeArguments();
                for(Type fieldArgType : fieldArgTypes){
                    Class fieldArgClass = (Class) fieldArgType;
                    System.out.println("fieldArgClass = " + fieldArgClass);
                }
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }   
}

результаты:

fieldArgClass = class test.TypeReflectionExample$SomeType

То же самое можно сделать для методов, конструкторов, расширений/реализаций суперкласса и т. д.

Я награждаю Хайлема, так как его пост привел меня к этому решению, даже если он не дал прямого ответа на мой вопрос.

14
задан Mike Samuel 6 March 2012 в 16:05
поделиться