获取泛型参数的类型
Class
<
T
>
entityClass
=
(Class
<
T
>
)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[
0
];
出现:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
使用以下工具类方法获取
- 1 package cn.pconline.prolib.util;
- 2 import java.lang.reflect.ParameterizedType;
- 3 import java.lang.reflect.Type;
- 4
- 5 public class GenericsUtils {
- 6 /**
- 7 * 通过反射,获得定义Class时声明的父类的范型参数的类型.
- 8 * 如public BookManager extends GenricManager<Book>
- 9 *
- 10 * @param clazz The class to introspect
- 11 * @return the first generic declaration, or <code>Object.class</code> if cannot be determined
- 12 */
- 13 public static Class getSuperClassGenricType(Class clazz) {
- 14 return getSuperClassGenricType(clazz, 0);
- 15 }
- 16
- 17 /**
- 18 * 通过反射,获得定义Class时声明的父类的范型参数的类型.
- 19 * 如public BookManager extends GenricManager<Book>
- 20 *
- 21 * @param clazz clazz The class to introspect
- 22 * @param index the Index of the generic ddeclaration,start from 0.
- 23 */
- 24 public static Class getSuperClassGenricType(Class clazz, int index) throws IndexOutOfBoundsException {
- 25
- 26 Type genType = clazz.getGenericSuperclass();
- 27
- 28 if (!(genType instanceof ParameterizedType)) {
- 29 return Object.class;
- 30 }
- 31
- 32 Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
- 33
- 34 if (index >= params.length || index < 0) {
- 35 return Object.class;
- 36 }
- 37 if (!(params[index] instanceof Class)) {
- 38 return Object.class;
- 39 }
- 40 return (Class) params[index];
- 41 }
- 42 }
Class<T> entityClass = GenericsUtils.getSuperClassGenricType(BasicService.class, 0);