如何在运行时获取泛型的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在运行时获取泛型的类型相关的知识,希望对你有一定的参考价值。

在父类的构造方法中,获取泛型的具体类型
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import com.opensymphony.xwork2.ModelDriven;
/**
* 工具类直接返回ModelDriven的对象
*/
public class ModelBaseAction<T> extends BaseAction implements ModelDriven<T>
protected T model;
/**
* 通过反射,获取泛型的具体类型并实例化这个类型
*/
public ModelBaseAction()
// 获取反射的类型
java.lang.reflect.Type cls = super.getClass().getGenericSuperclass();
if (cls instanceof ParameterizedType)
ParameterizedType pt = (ParameterizedType) cls;
// 获取所有放到泛型里面的类型
Type[] tps = pt.getActualTypeArguments();
System.err.println(tps[0].getTypeName());
try
// 实例化这个泛型所代表的类对象
model = (T) Class.forName(tps[0].getTypeName()).newInstance();
catch (Exception e)
throw new RuntimeException("没有默认构造方法", e);



@Override
public final T getModel()
return model;


参考技术A java 的泛型在jdk1.5 以后添加 在运行时采用的是擦除的机制 也就是说泛型只在编译器才进行检查 运行时会向上线进行擦除 如果没有指定上线的话就会擦除为object 所以你取不到

如何反射获取List<T> 中泛型的类型

参考技术A Class1s xx = new Class1s();
var inters = xx.GetType().GetInterfaces();//获取所有继承的泛型类型
if (inters.Length > 0)

var ts = inters[0].GetGenericArguments();//获取第一个泛型的形参类型数组
if (ts.Length > 0)

var res = ts[0];//获取到Class1
//todo:后续代码


已知类型Class1,获取它的属性集合,你上面的代码已经有了。

有点要注意,在获取第一个泛型的形参类型那里,不用的类型继承的泛型接口也不同,例如,可能是IList、IList、Dictionary的,所以不一定是第一个泛型就可以获取出T。这里应该还是有根据实际情况做相应处理的过程。

另外,如果已知是List的话,有一个很简单的方法:
xx.GetType().GetMethod("Find").ReturnType。就可以返回Class1的Type了,这种就很有针对性,专门针对List的T Find()函数设计。获得Find函数的返回类型即可。

希望能给你启示。

以上是关于如何在运行时获取泛型的类型的主要内容,如果未能解决你的问题,请参考以下文章

当List的size为0时,如何获取List中泛型的类型

java中啥叫泛型??

C# 泛型的使用

C# 深入了解泛型

Java中定义泛型<T>时,怎么获得泛型的类型

java-泛型