Я ищу доступ к родовому типу объявленного поля во время выполнения. Раньше у меня создалось впечатление, что это невозможно из-за стирания Java-типа. Однако это не должно быть так, потому что некоторые хорошо известные фреймворки используют общий тип посредством отражения во время выполнения.
В качестве примера, Guice будет внедрять поставщика на основе общего типа, который вы предоставляете:
public class Injectable{
@Inject
private Provider<SomeType> someTypeProvider;
}
Как получить доступ к универсальному атрибуту "SomeType" для поля или любого такого типа/метода/etc через API отражения?
Кроме того, было бы полезно также знать, как получить доступ к этим атрибутам типового типа с помощью API-интерфейсов Java 6 Annotation Processor.
Спасибо.
Edit:
Спасибо всем за ваши большие указатели. Я нашел способ сделать это, используя ссылки haylem, в частности, статью Пренкова Java Reflection: Generics.
Вот ответ, который я искал:
/**
* @author John Ericksen
*/
public class TypeReflectionExample {
public class SomeType{}
public class Injectable{
@Inject private Provider<SomeType> 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= класс test.TypeReflectionExample $SomeType
То же самое можно сделать для методов, конструкторов, расширений/инструментов Суперкласса и т.д.
Я награждаю haylem, так как его сообщение привело меня к этому решению, даже если оно прямо не ответило на мой вопрос.