有的时候我们需要获取泛型的指定索引的参数,就可以使用下面的代码。
/** * <p> * 反射对象获取泛型 * </p> * * @param clazz 对象 * @param index 泛型所在位置 * @return Class */ public static Class<?> getSuperClassGenericType(final Class<?> clazz, final int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { logger.warn(String.format("Warn: %s's superclass not ParameterizedType", clazz.getSimpleName())); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) { logger.warn(String.format("Warn: Index: %s, Size of %s's Parameterized Type: %s .", index, clazz.getSimpleName(), params.length)); return Object.class; } if (!(params[index] instanceof Class)) { logger.warn(String.format("Warn: %s not set the actual class on superclass generic parameter", clazz.getSimpleName())); return Object.class; } return (Class<?>) params[index]; }
使用方法:
public abstract class CrudServiceImpl<M extends BaseMapper<T>, T, D> extends BaseServiceImpl<M, T> implements CrudService<T, D> { protected Class<D> currentDtoClass() { return (Class<D>)ReflectionKit.getSuperClassGenericType(getClass(), 2); } }
这样操作就可以获取到当前类的第三个泛型参数了。