如何在java中获取带有反射的泛型字段的main类型



假设我的项目中有以下类:

public class MyBaseEntity<T> {
    T   id;
}
public class MySubClass extends MyBaseEntity<Long> {
}

现在,我想用java反射得到MySubClassidjava.lang.Long)字段的主类型,我该怎么做?

更新

我把类改成了这个,并添加了两个新的Class:

public class MySubClass3 extends MyBaseEntity<Integer> {
}
public class MySubClass2 extends MySubClass3 {
}
public class MySubClass extends MySubClass2 {
}

现在,我如何获得id的main类型,换句话说,如果继承的深度是动态的,我如何获取特定类的id的main类型?

将类型传递给基类的构造函数

public MyBaseEntity(Class<?> clazz) {
    this.clazz = clazz;
}

好吧,您可以在运行时定义哪个类用于MyBaseEntityT参数,方法如下:

Type type = MySubClass.class.getGenericSuperclass();
if(type instanceof ParameterizedType) {
    Type parameterType = ((ParameterizedType) type).getActualTypeArguments()[0];
    if(parameterType instanceof Class) {
        System.out.println(((Class<?>)parameterType).getName());
        // prints java.lang.Long
    }
}

但这是一种非常容易出错的方法。您可能有更棘手的继承或使用像class SubClass<T extends Number> extend MyBaseEntity<T>这样的通配符,并且您将不得不专门处理这种情况。因此,我建议您使用@Reimeus建议的方法。

最新更新