正常情况下 Java 的反射是可以获取到普通的泛型类型的,例如假设存在基类
@Data
public static class Page<T> {
private List<T> data;
private List<String> ids;
}
此时直接执行
FieldUtils.getField(Page.class, "ids", true).getGenericType()
可以拿到类型为 ParameterizedType
的 java.util.List<java.lang.String>
对象
但特殊情况下,例如子类
@Data
public static class StringPage extends Page<String> {
}
此时查询 StringPage 子类的 data 属性就只能拿到类型为 java.util.List<T>
的对象了,这时候怎么拿到它的真实类型呢
GitHub 找了个工具 https://github.com/leangen/geantyref
<dependency>
<groupId>io.leangen.geantyref</groupId>
<artifactId>geantyref</artifactId>
<version>1.3.13</version>
</dependency>
直接调用 GenericTypeReflector.getExactFieldType(field, StringPage.class)
就可以拿到来自继承的正常真实类型 java.util.List<java.lang.String>
了
这个 jar 包支持功能也是比较全的,各种方法、属性、返回值来自继承的泛型都能正常获取