`

实用的反射类工具源码分析---SpringSide的工具类

 
阅读更多
SpringSide的工具类。
pk: org.springside.core.utils
public class GenericsUtils


/**
	 * 通过反射,获得定义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 getSuperClassGenricType(Class clazz, int index) {
		//得到clazz的父类
		Type genType = clazz.getGenericSuperclass();

		//如果没有实现ParameterizedType 接口,即不支持泛型,所以直接返回Object.class 
//**这个接口是jdk1.5以后才出来的。
		if (!(genType instanceof ParameterizedType)) {
			log.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
			return Object.class;
		}
		//	返回表示此类型实际类型参数的 Type 对象的数组,数组里放的都是对应类型的Class
		//如UserAction extends StrutsSecurityAction<User, UserManager> 就返回User和UserManager类型
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		
				
		if (index >= params.length || index < 0) {
			log.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "+ params.length);
			return Object.class;
		}
		
		if (!(params[index] instanceof Class)) {
			log.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
			return Object.class;
		}
		return (Class) params[index];
	}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics