Java 运行时反射获取来自继承的泛型

背景

正常情况下 Java 的反射是可以获取到普通的泛型类型的,例如假设存在基类

@Data
public static class Page<T> {
    private List<T> data;
    private List<String> ids;
}

此时直接执行

FieldUtils.getField(Page.class, "ids", true).getGenericType()

可以拿到类型为 ParameterizedTypejava.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 包支持功能也是比较全的,各种方法、属性、返回值来自继承的泛型都能正常获取

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注