获取方法泛型
public class Demo {
public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException {
// 获取成员方法返回值的泛型类型信息
getMethodReturnValueGeneric();
System.out.println("======================================");
// 获取成员变量的泛型类型信息
getMemberVariablesGeneric();
System.out.println("======================================");
// 获取成员方法参数的泛型类型信息
getMethodParametricGeneric();
}
/**
* 获取方法返回值的泛型类型信息
*
* @throws NoSuchMethodException
*/
public static void getMethodReturnValueGeneric() throws NoSuchMethodException {
// 获取名为"getList"的方法,在MyClass类中
Method getListMethod = MyClass.class.getMethod("getList");
// 获取返回值类型,getGenericReturnType()会返回值带有泛型的返回值类型
Type genericReturnType = getListMethod.getGenericReturnType();
// 但我们实际上需要获取返回值类型中的泛型信息,所以要进一步判断,即判断获取的返回值类型是否是参数化类型ParameterizedType
if (genericReturnType instanceof ParameterizedType) {
// 如果要使用ParameterizedType中的方法,必须先强制向下转型
ParameterizedType type = (ParameterizedType) genericReturnType;
// 获取返回值类型中的泛型类型,因为可能有多个泛型类型,所以返回一个数组
Type[] actualTypeArguments = type.getActualTypeArguments();
// 循环数组,遍历每一个泛型类型
for (Type actualTypeArgument : actualTypeArguments) {
Class typeArgClass = (Class) actualTypeArgument;
System.out.println("成员方法返回值的泛型信息:" + typeArgClass);
}
}
}
/**
* 获取类中成员变量的泛型类型信息
*
* @throws NoSuchFieldException
*/
public static void getMemberVariablesGeneric() throws NoSuchFieldException {
// 获取MyTestClass类中名为"list"的字段
Field listField = MyClass.class.getField("list");
// 获取该字段的类型信息,getGenericType()方法能够获取带有泛型的类型信息
Type genericType = listField.getGenericType();
// 但我们实际上需要获取返回值类型中的泛型信息,所以要进一步判断,即判断获取的返回值类型是否是参数化类型ParameterizedType
if (genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
// 获取成员变量的泛型类型信息
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
Class fieldArgClass = (Class) actualTypeArgument;
System.out.println("成员变量的泛型信息:" + fieldArgClass);
}
}
}
/**
* 获取方法参数的泛型类型信息
*
* @throws NoSuchMethodException
*/
public static void getMethodParametricGeneric() throws NoSuchMethodException {
// 获取MyTestClass类中名为"setList"的方法
Method setListMethod = MyClass.class.getMethod("setList", List.class);
// 获取该方法的参数类型信息(带有泛型)
Type[] genericParameterTypes = setListMethod.getGenericParameterTypes();
// 但我们实际上需要获取返回值类型中的泛型信息,所以要进一步判断,即判断获取的返回值类型是否是参数化类型ParameterizedType
for (Type genericParameterType : genericParameterTypes) {
ParameterizedType parameterizedType = (ParameterizedType) genericParameterType;
// 获取成员方法参数的泛型类型信息
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
Class realType = (Class) actualTypeArgument;
System.out.println("成员方法参数的泛型信息:" + realType);
}
}
}
}
/*打印结果:
成员方法返回值的泛型信息:class java.lang.Object
======================================
成员变量的泛型信息:class java.lang.Object
======================================
成员方法参数的泛型信息:class java.lang.Object
*/
原文链接:https://blog.csdn.net/cnds123321/article/details/119655880