java中如何得到泛型参数的class?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何得到泛型参数的class?相关的知识,希望对你有一定的参考价值。

泛型的类型是无法在运行时通过反射取得的,泛型类型在编译成字节码的时候已经被虚拟机给去掉了,只是起到提示编译器进行类型检查的作用
用这种方法你试一试:父类:import java.lang.reflect.ParameterizedType;
public class Parent<T
public Parent()
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
System.out.println("type==" + type);
System.out.println("entityClass==" + type.getActualTypeArguments()[0]);
System.out.println("getOwnerType==" + type.getOwnerType());
System.out.println("getRawType==" + type.getRawType());子类:public class Child<T extends Parent<String
参考技术A 泛型的类型是无法在运行时通过反射取得的,泛型类型在编译成字节码的时候已经被虚拟机给去掉了,只是起到提示编译器进行类型检查的作用用这种方法你试一试:父类:import java.lang.reflect.ParameterizedType;public class Parentpublic Parent() ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();System.out.println("type==" + type);System.out.println("entityClass==" + type.getActualTypeArguments()[0]);System.out.println("getOwnerType==" + type.getOwnerType());System.out.println("getRawType==" + type.getRawType());子类:public class Child 参考技术B 举例获取这个类的类型参数E的Class对象 Class A implements I<E>

Tpye[] genericInterfaces = A.class.getGenericInterfaces();
String genericInterfaceName = genericInterfaces[0].getTypeName();
String genericName = genericInterfaceName .subString(genericInterfaceName.indexOf("<")+1,genericInterfaceName.indexOf(">"));
Class E = Class.forName(genericName); //这个E就是类型参数的class
参考技术C java是无法得到泛型的class的,具体我也忘了,你可以看看《java编程思想》泛型那一章,有详细的解说

java获取泛型class

参考技术A 很多朋友都想知道java怎么获取泛型class?下面就一起来了解一下吧~
获取泛型Class的方法
Class类的方法:
public Type getGenericSuperclass()
方法作用:

如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

ParameterizedType类的方法:

Type[] getActualTypeArguments()

方法作用:返回表示此类型实际类型参数的 Type 对象的数组。

注意,在某些情况下,返回的数组为空。如果此类型表示嵌套在参数化类型中的非参数化类型,则会发生这种情况。

二、获取泛型Class对象

(解析Excel的类代码较多,这里定义几个简单的类记录)

定义获取泛型Class对象的工具类

GenericSuperclassUtil
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericSuperclassUtil  /* * 获取泛型类Class对象,不是泛型类则返回null */ public static Class  getActualTypeArgument(Class  clazz)  Class  entitiClass = null; Type genericSuperclass = clazz.getGenericSuperclass(); if (genericSuperclass instanceof ParameterizedType)  Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass) .getActualTypeArguments(); if (actualTypeArguments != null && actualTypeArguments.length > 0)  entitiClass = (Class ) actualTypeArguments[0]; return entitiClass;
定义BaseService ,用来测试不使用父类时泛型Class的获取

BaseService
public class BaseService   public Class  getEntityClass()  return GenericSuperclassUtil.getActualTypeArgument(this.getClass());
测试BaseService.getEntityClass() @Testpublic void testBaseService()  System.out.println(new BaseService ().getEntityClass());// 控制台输出:null

以上是关于java中如何得到泛型参数的class?的主要内容,如果未能解决你的问题,请参考以下文章

java获取泛型class

Java:泛型参数上带有.class的泛型方法[重复]

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

Java 得到泛型中得到T.class

java泛型

java 反射和泛型-反射来获取泛型信息