Существует два случая.
Первый случай, когда параметризованный тип свойства неизвестен во время компиляции:
public class Pair<A, B> {
public A getFirst() { ... }
public B getSecond() { ... }
}
В этом случае вы не можете знать во время компиляции,и это то, о чем говорит @darioo.
Второй случай - ваш, когда параметры типа свойств известны во время выполнения.Приведенный ниже код должен помочь вам точно определить, что вы хотите сделать:
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass, Object.class);
PropertyDescriptor descriptors[] = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor d : descriptors) {
final Type type = d.getReadMethod().getGenericReturnType();
if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
System.out.println(d.getDisplayName());
for (Type atp : pt.getActualTypeArguments()) {
System.out.println(" " + atp);
}
}
}
Ключ здесь заключается в том, чтобы получить метод чтения или записи и использовать API Method.getGenericReturnType()
или Method.getParameterTypes()
соответственно.
Обратите внимание, что работа с java.lang.reflect.Type
в общем случае становится довольно утомительной / хитрой, рассмотрим, например:
public Map<Nation, Map<A extends PostCode, B extends Location>> getGlobalPostCodes() { ... }