package com.mossle.core.util; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Generics的util类. 来自www.springside.org.cn * * @author sshwsfc * @since 2007-03-14 * @version 1.0 */ public class GenericsUtils { /** * 日志. */ private static Logger logger = LoggerFactory.getLogger(GenericsUtils.class); /** * 构造方法. */ protected GenericsUtils() { } /** * 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends GenricManager<Book> * * @param clazz * The class to introspect * @return the first generic declaration, or <code>Object.class</code> if cannot be determined */ public static Class getSuperClassGenericType(Class clazz) { return getSuperClassGenericType(clazz, 0); } /** * 通过反射,获得定义Class时声明的父类的范型参数的类型. 如public BookManager extends GenricManager<Book> * * @param clazz * clazz The class to introspect * @param index * the Index of the generic ddeclaration,start from 0. * @return the index generic declaration, or <code>Object.class</code> if cannot be determined */ public static Class getSuperClassGenericType(Class clazz, int index) { Type genType = clazz.getGenericSuperclass(); if (clazz.getSimpleName().indexOf("$$EnhancerByCGLIB$$") != -1) { genType = ((Class) genType).getGenericSuperclass(); } if (!(genType instanceof ParameterizedType)) { logger.warn("{}'s superclass not ParameterizedType", clazz.getSimpleName()); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if ((index >= params.length) || (index < 0)) { logger.warn( "Index: {}, Size of {}'s Parameterized Type: {}", new Object[] { index, clazz.getSimpleName(), params.length }); return Object.class; } if (!(params[index] instanceof Class)) { logger.warn( "{} not set the actual class on superclass generic parameter", clazz.getSimpleName()); return Object.class; } return (Class) params[index]; } }