Java如何获取泛型类型如何获取泛型类型
参考:我眼中的Java-Type体系(1)
我眼中的Java-Type体系(2)
秒懂Java类型(Type)系统
Java 运行时如何获取泛型参数的类型
Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType
从实现的接口获取泛型参数从实现的接口获取泛型参数
定义一个泛型父类:
public interface SuperClass
{
String process(P p);
}
实现类1:
public class OneImpl implements SuperClass {
@Override
public String process(House house) {
return null;
}
}
测试一下:
public static void main(String[] args) throws Exception {
SuperClass superClass = new OneImpl();
// 获取运行时类型
System.out.println(superClass.getClass());
// 获取实现的接口
Type[] types = superClass.getClass().getGenericInterfaces();
for (Type t : types) {
// ParameterizedType 的实现类:ParameterizedTypeImpl
System.out.println("ParameterizedTypeImpl: " + t.getClass().getName());
// 带有泛型信息
System.out.println(t);
System.out.println(t instanceof ParameterizedType);
// 获取声明这个泛型的类或接口
System.out.println(((ParameterizedType) t).getRawType());
// 获取泛型中的实际类型,可能存在多个泛型,比如 SuperClass
,所以会返回 Type[] 数组
Type[] paramGenericTypes = ((ParameterizedType) t).getActualTypeArguments();
for (Type actualType : paramGenericTypes) {
// 得到泛型的实际类型,这里也就得到了 Class 类型
System.out.println("actualTypeName: " + actualType.getClass().getName());
System.out.println(actualType);
}
}
System.out.println("------------------------------");
// 获取实现的接口
Class[] t = superClass.getClass().getInterfaces();
for (Class c : t) {
System.out.println(c);
}
}
输出:
class com.jiaobucong.common.core.generic.OneImpl
ParameterizedTypeImpl: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
com.jiaobucong.common.core.generic.SuperClass
true
interface com.jiaobucong.common.core.generic.SuperClass
actualTypeName: java.lang.Class
class com.jiaobucong.common.core.generic.House
------------------------------
interface com.jiaobucong.common.core.generic.SuperClass
实现类2,不带泛型: