如何在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模板中使用它吗?