Вчера я работал над динамическим сопоставлением маршалеров с их маршалированным типом. Как я это сделал, у меня был интерфейс Marshaller с общим параметром <T>. Затем я использовал Reflections, чтобы получить все классы, реализующие этот интерфейс. Затем мне нужно было получить фактический тип <T>, что является проблемой, если, например, существует абстрактный класс, который является базой для всех маршалеров. Итак, если у вас есть следующая настройка, это не так просто, как просто вызвать ParameterizedType#getActualTypeArguments().

interface Marshaller<T> {
    ... 
}
abstract class AbstractMarshaller<T> implements Marshaller<T> { 
    ... 
}
class BooleanMarshaller extends AbstractMarshaller<Boolean> {
    ... 
}

Поэтому я написал следующий метод, который разрешает фактические типы всех общих параметров данного класса.

И вы бы использовали это так:

Map<TypeVariable, Type> params = genericParameters(Marshaller.class, BooleanMarshaller.class, null);

И карта params будет иметь ровно одну запись, (TypeVariable) "T" => (Class) Boolean.

Я написал это, потому что не смог найти решение где-либо еще, поэтому, надеюсь, это поможет кому-то в будущем.

Первоначально опубликовано на www.tadeaskriz.com 11 апреля 2014 г.