В API отражения Java нет метода, который напрямую дает то, что вы хотите, но он предоставляет всю основную информацию, необходимую для возможности вычисления с помощью Field.getGenericType()
и Class.getGenericSuperclass()
.Но решить эту проблему в целом для любой иерархии классов и типа поля нетривиально.
Для этого вычисления вы можете использовать библиотеку gentyref .В вашем примере вы можете получить тип переменной someMap следующим образом:
Type someMapType = GenericTypeReflector.getExactFieldType(
Example2.class.getField("someMap"),
Example2.class);
Если доступно достаточное количество информации (а в примере 2 это так), то someMapType будет ParameterizedType ,Затем вы можете получить тип ключа и значение, например:
((ParameterizedType)someMapType).getActualTypeArguments();
Это будет массив, содержащий URL.class
дважды.Обратите внимание, что он может содержать и другие вещи, кроме классов (например, другой ParameterizedType).Поэтому, если вы хотите сделать что-то нетривиальное с этим типом (например, посмотрите, является ли это супертипом другого типа), другие методы в GenericTypeReflector также могут пригодиться ...
[Яавтор gentyref]