Вчера я работал над динамическим сопоставлением маршалеров с их маршалированным типом. Как я это сделал, у меня был интерфейс 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 г.