📅  最后修改于: 2023-12-03 15:10:25.004000             🧑  作者: Mango
在Java中,通过反射机制可以获取到类中的方法信息,并通过 Method 类的 getParameterTypes()方法获取到方法的参数类型。但是,在Java5中,又出现了一个新的方法 getGenericParameterTypes(),它可以获取方法定义时使用的泛型参数类型。
getGenericParameterTypes() 方法的返回值是一个 Type 对象数组,Type 类型是在Java5中引入的表示各种类型的类。这个数组中的每个元素表示方法中一个参数的类型,包括泛型参数类型。
下面是一个示例代码:
import java.lang.reflect.Method;
import java.lang.reflect.Type;
public class TestClass {
public void testMethod(List<Integer> list, Map<String, Object> map) {
// 方法体
}
public static void main(String[] args) throws Exception {
Method method = TestClass.class.getMethod("testMethod", List.class, Map.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type type : genericParameterTypes) {
System.out.println(type);
}
}
}
在这个例子中,我们获取了 TestClass 类的 testMethod 方法,并使用 getGenericParameterTypes() 方法获取方法的参数类型。这个方法的返回值实际上是一个 Type 对象数组,在这个例子中,它的长度为 2,分别表示方法的两个参数。
在Java中,泛型类型在编译时会被擦除,即使在源代码中指定了泛型类型参数,但在编译后这些类型信息会被擦除掉。因此,在运行时我们无法确定一个对象的具体类型参数。
不过,通过使用 getGenericParameterTypes() 方法,我们可以在运行时获取到方法中声明的具体泛型类型参数。例如,在上面的示例中,我们可以通过以下代码获取到 List 中的具体泛型类型参数:
ParameterizedType parameterizedType = (ParameterizedType) genericParameterTypes[0];
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
System.out.println(actualTypeArguments[0]);
这段代码中,我们首先获取了第一个参数的类型,也就是 List 类型。然后,我们将这个类型转换为 ParameterizedType 对象,并通过 getActualTypeArguments() 方法获取到具体的泛型类型参数,这里是 Integer。
getGenericParameterTypes() 方法是Java5中新增的方法之一,它可以获取到方法声明时使用的泛型类型参数,并帮助我们解决泛型擦除问题。在使用这个方法时,需要注意返回值类型是 Type[] 数组,需要使用具体的 Type 类型或其子类进行转换,才能获取到具体的泛型类型参数信息。