java反射中,getmethodtypes()获取擦除后形参类型,getgenericparametertypes()保留泛型信息;getreturntype()返回擦除后返回类型,getgenericreturntype()返回含泛型的完整类型。

Java 反射中,可以通过 Method 对象获取方法的形参列表和返回值类型,核心是调用其提供的 getParameterTypes()、getGenericParameterTypes()、getReturnType() 和 getGenericReturnType() 方法。
获取形参类型(基础类型)
使用 method.getParameterTypes() 返回 Class[] 数组,每个元素代表对应参数的**运行时擦除后的类型**(即不带泛型信息)。
- 适用于普通场景,如判断是否为
String、int、List等 - 对泛型集合(如
List<user></user>)只返回List.class,无法得知User
获取形参类型(含泛型信息)
使用 method.getGenericParameterTypes() 返回 Type[] 数组,可保留泛型实际类型(需配合 ParameterizedType 解析)。
- 适合需要精确识别
List<string></string>、Map<integer extends number></integer>的场景 - 若参数是泛型类型,需逐个判断是否为
ParameterizedType,再调用getActualTypeArguments()
获取返回值类型(基础与泛型)
method.getReturnType() 返回擦除后的返回类型(Class),method.getGenericReturnType() 返回完整泛型类型(Type)。
- 例如方法声明为
public List<user> getUsers() {...}</user>:
→getReturnType()返回List.class
→getGenericReturnType()返回ParameterizedType,可提取出User.class - 注意:原始类型(如
int)和包装类(如Integer)在getReturnType()中会分别返回int.class和Integer.class
实用小提示
获取 Method 对象本身需先通过 Class.getDeclaredMethod() 或 getMethods();若方法是私有或带泛型,记得设置 setAccessible(true) 并优先使用 getDeclaredXXX 系列方法。
不复杂但容易忽略:泛型信息只在源码编译期存在,运行时仅对「被反射的方法自身声明处」的泛型有效;方法体内 new 出来的泛型对象无法通过反射反推。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











