如何在java中通过反射获取泛型字段的主要类型?

如何在java中通过反射获取泛型字段的主要类型?,java,generics,reflection,code-generation,freemarker,Java,Generics,Reflection,Code Generation,Freemarker,假设我的项目中有以下几类: public class MyBaseEntity<T> { T id; } public class MySubClass extends MyBaseEntity<Long> { } 现在,我如何获得id的主类型,换句话说,如果继承的深度是动态的,我如何才能获得特定类的id的主类型?将类型传递给基类的构造函数 public MyBaseEntity(Class<?> clazz) { this.claz

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

public class MyBaseEntity<T> {
    T   id;
}

public class MySubClass extends MyBaseEntity<Long> {

}

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

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

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

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

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

好的,您可以在运行时使用如下方法定义
MyBaseEntity
T
参数使用了哪个类:

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
    }
}
Type Type=MySubClass.class.getGenericSuperclass();
if(类型instanceof ParameterizedType){
类型parameterType=((ParameteredType)类型).getActualTypeArguments()[0];
if(类的参数类型instanceof){
System.out.println(((Class)parameterType.getName());
//打印java.lang.Long
}
}

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

好的,您可以在运行时使用如下方法定义将哪个类用于
MyBaseEntity
T
参数:

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
    }
}
Type Type=MySubClass.class.getGenericSuperclass();
if(类型instanceof ParameterizedType){
类型parameterType=((ParameteredType)类型).getActualTypeArguments()[0];
if(类的参数类型instanceof){
System.out.println(((Class)parameterType.getName());
//打印java.lang.Long
}
}
但这是一种非常容易出错的方法。您可能有更棘手的继承或使用通配符,如
class SubClass extend MyBaseEntity
,您将不得不专门处理此类情况。因此,我建议您使用@Reimeus建议的方法。

使用:

Class type=TypeResolver.resolveRawArgument(MySubClass.Class,MyBaseEntity.Class);
断言类型==Integer.class;
使用:

Class type=TypeResolver.resolveRawArgument(MySubClass.Class,MyBaseEntity.Class);
断言类型==Integer.class;

只有在实际为其分配了
Long
时,才能执行此操作。在类型擦除之后,变量本身的类型为
Object
。只有在实际为其指定
Long
时,才能执行此操作。在类型擦除之后,变量本身的类型为
Object
。谢谢,您知道我如何在freemarker模板中使用它吗?谢谢,您知道我如何在freemarker模板中使用它吗?