Как получить значения параметра типа с использованием java-отражения?
interface Foo<T> { ... }
class Bar implements Foo<Baz> { ... }
У меня есть объект Bar. Как получить значение T для него (Baz)?
До сих пор мне удалось получить интерфейс и T, но я не вижу способа получить его значение.
Спасибо заранее.
Ответ 1
Type type = bar.getClass().getGenericInterfaces()[0];
if (type instanceof ParameterizedType) {
Type actualType = ((ParameterizedType) type).getActualTypeArguments()[0];
System.out.println(actualType);
}
Конечно, в общем случае вы должны перебирать массив, а не предполагать, что он имеет один элемент ([0]). В приведенном выше примере вы можете отбрасывать actualType до java.lang.Class. В других случаях это может быть другим (см. Комментарий meriton)
Ответ 2
Если у вас уже есть Guava в пути к классам, это немного более устойчиво, поскольку вы указываете интерфейс/суперкласс по типу, а не по индексу.
TypeToken<?> baz = TypeToken.of(Bar.class).resolveType(Foo.class.getTypeParameters()[0]);
System.out.println(baz.getRawType()); // class Baz