package com.geccocrawler.gecco.utils;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Set;
import org.reflections.ReflectionUtils;
/**
* 泛型,Type的相关知识
*
* http://developer.51cto.com/art/201103/250028.htm http://lsy.iteye.com/blog/220264
*
* @author huchengyi
*
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ReflectUtils {
/**
* 获得类的所有基类和接口
*
* @param clazz 类
* @return 所有基类的集合
*/
public static Set<Class<?>> getAllSuperType(Class clazz) {
return ReflectionUtils.getAllSuperTypes(clazz);
}
/**
* 是否继承某个基类
*
* @param childClazz
* 子类
* @param superClazz
* 基类
* @return 是否继承某个基类
*/
public static boolean haveSuperType(Class childClazz, Class superClazz) {
for (Class<?> clazz : getAllSuperType(childClazz)) {
if (clazz.equals(superClazz)) {
return true;
}
}
return false;
}
/**
* 是否继承某个基类
*
* @param bean 需要判断的对象bean
* @param superClazz 基类
* @return 是否继承某个基类
*/
public static boolean haveSuperType(Object bean, Class superClazz) {
return haveSuperType(bean.getClass(), superClazz);
}
public static Class getGenericClass(Type type, int i) {
if (type instanceof ParameterizedType) { // 处理泛型类型
return getGenericClass((ParameterizedType) type, i);
} else if (type instanceof TypeVariable) { // 处理泛型擦拭对象
return getGenericClass(((TypeVariable) type).getBounds()[0], 0);
} else {// class本身也是type,强制转型
return (Class) type;
}
}
private static Class getGenericClass(ParameterizedType parameterizedType, int i) {
Object genericClass = parameterizedType.getActualTypeArguments()[i];
if (genericClass instanceof ParameterizedType) { // 处理多级泛型
return (Class) ((ParameterizedType) genericClass).getRawType();
} else if (genericClass instanceof GenericArrayType) { // 处理数组泛型
return (Class) ((GenericArrayType) genericClass).getGenericComponentType();
} else if (genericClass instanceof TypeVariable) { // 处理泛型擦拭对象
return getGenericClass(((TypeVariable) genericClass).getBounds()[0], 0);
} else {
return (Class) genericClass;
}
}
}