Java 获取泛型的类型实例详解
Java获取泛型的类型实例详解
Java泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等。
以下方式是不正确的:
①.获取带泛型的类的类型
ClasslstUClazz=List.class
②获取局部变量泛型的类型
ListlistUser=newArrayList (); TypegenType=listUser.getClass().getClass().getGenericSuperclass(); ClasstemplatClazz=null; if(ParameterizedType.class.isInstance(genType) { //无法获取到User类,或者可能获取到错误的类型,如果有同名且不带包名的泛型存在 ParameterizedTypeparameterizedType=(ParameterizedType)genType; templatClazz=(Class)parameterizedType.getActualTypeArguments()[0]; }
那么,如何才能获取到泛型的类型
①.必须具有真实类型的存在
②.泛型的类型是明确的如(List
满足以上两点,我们就可以获取泛型的类型了
1.通过继承方式,明确类型,然后获取泛型类
publicabstractclassJdbcDaoSupport{ protectedJdbcDaoSupport(){ } publicClassgetTempalteType() { Class clazz=(Class )((ParameterizedType)getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; returnclazz; } } publicclassUserDaoextendsJdbcDaoSupport { } publicclassTest{ publicstaticvoidmain(String[]args) { UserDaodao=newUserDao(); Classclazz=dao.getTemplateType(); System.out.println(clazz.getName());//输出xxx.xxx.User } }
2.获取类属性的泛型类型
publicclassTestextendsClassA{ privateList list; privateMap map; /*** *获取List中的泛型 */ publicstaticvoidtestList()throwsNoSuchFieldException,SecurityException{ Typet=Test.class.getDeclaredField("list").getGenericType(); if(ParameterizedType.class.isAssignableFrom(t.getClass())){ for(Typet1:((ParameterizedType)t).getActualTypeArguments()){ System.out.print(t1+","); } System.out.println(); } } /*** *获取Map中的泛型 */ publicstaticvoidtestMap()throwsNoSuchFieldException,SecurityException{ Typet=Test.class.getDeclaredField("map").getGenericType(); if(ParameterizedType.class.isAssignableFrom(t.getClass())){ for(Typet1:((ParameterizedType)t).getActualTypeArguments()){ System.out.print(t1+","); } System.out.println(); } } publicstaticvoidmain(Stringargs[])throwsException{ System.out.println(">>>>>>>>>>>testList>>>>>>>>>>>"); testList(); System.out.println("<<<<<<<<<< >>>>>>>>>>testMap>>>>>>>>>>>"); testMap(); System.out.println("<<<<<<<<<< >>>>>>>>>>testClassA>>>>>>>>>>>"); newTest().testClassA(); System.out.println("<<<<<<<<<< 3.获取局部变量的泛型的类型
Listlst=newArrayList (){}; TypegenType=listUser.getClass().getClass().getGenericSuperclass(); ClasstemplatClazz=null; if(ParameterizedType.class.isInstance(genType) { ParameterizedTypeparameterizedType=(ParameterizedType)genType; templatClazz=(Class)parameterizedType.getActualTypeArguments()[0]; } 实际上,我们发现,能获取到泛型的类型实际上都是进行了“继承”。当然如果能熟练运用上述技巧,可以做很多事情,比如开源项目Gson中的TypeToken就是利用上述技巧,实现json与复杂类型的转换的。
很多情况下,Class被用来当作参数,我们其实可以将带泛型的类作为参数传入
我们一般为了方便,很少去特定定义一个类,因此,我们需要使用如下方式了。
Classclz=newArrayList(){}.getClass(); 例子
classJsonToObjectUtil{ publicstaticTjsonToObject(Class clz,List jsonList){ TypegenType=clz.getClass().getGenericSuperclass(); ClasstemplatClazz=null; if(ParameterizedType.class.isInstance(genType)); { ParameterizedTypeparameterizedType=(ParameterizedType)genType; templatClazz=(Class)parameterizedType.getActualTypeArguments()[0]; } List 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!