有如下带泛型的类
public class MyObjectWithGenerics {
/**
* 泛型成员变量
*/
public List<String> stringList;
/**
* 泛型方法返回值
*
* @return
*/
public List<String> getStringList() {
return stringList;
}
/**
* 泛型方法参数
*
* @param stringList
*/
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
}
获取泛型信息
Class<MyObjectWithGenerics> myObjectWithGenericsClass = MyObjectWithGenerics.class;
// 泛型方法返回类型
Method method = myObjectWithGenericsClass.getMethod("getStringList");
Type genericReturnType = method.getGenericReturnType();
if (genericReturnType instanceof ParameterizedType) {
ParameterizedType type = (ParameterizedType) genericReturnType;
Type[] actualTypeArguments = type.getActualTypeArguments();
for (Type typeArgument : actualTypeArguments) {
Class typeArgClass = (Class) typeArgument;
System.out.println("泛型方法返回类型 = " + typeArgClass);
}
}
// 泛型方法参数类型
method = myObjectWithGenericsClass.getMethod("setStringList", List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType) {
ParameterizedType aType = (ParameterizedType) genericParameterType;
Type[] parameterArgTypes = aType.getActualTypeArguments();
for (Type parameterArgType : parameterArgTypes) {
Class parameterArgClass = (Class) parameterArgType;
System.out.println("泛型方法参数类型 = " + parameterArgClass);
}
}
}
// 泛型成员变量类型
Field field = myObjectWithGenericsClass.getField("stringList");
Type genericFieldType = field.getGenericType();
if (genericFieldType instanceof ParameterizedType) {
ParameterizedType aType = (ParameterizedType) genericFieldType;
Type[] fieldArgTypes = aType.getActualTypeArguments();
for (Type fieldArgType : fieldArgTypes) {
Class fieldArgClass = (Class) fieldArgType;
System.out.println("泛型变量类型 = " + fieldArgClass);
}
}
结果如下
泛型方法返回类型 = class java.lang.String
泛型方法参数类型 = class java.lang.String
泛型变量类型 = class java.lang.String
源码地址
更多
微信公众号:卖字母维生(living-coding),更多教程、工具、资源分享