Java反射获取方法签名需区分擦除类型与泛型结构:参数、返回值、异常各有getXXX()(擦除后Class)和getGenericXXX()(保留泛型Type)两套API;完整签名还需修饰符、泛型形参及method.toGenericString()。

Java反射中获取方法签名,核心就是拿到参数类型、返回类型和抛出的异常列表这三部分。关键不在于“能不能拿到”,而在于“拿的是擦除后的类型,还是带泛型的真实结构”——这个区别直接影响序列化、类型校验、框架适配等实际场景。
参数类型:getParameterTypes() 与 getGenericParameterTypes()
两者都返回参数类型信息,但语义不同:
-
getParameterTypes() 返回
Class>[],每个元素是运行时擦除后的实际类型(如List<String>→java.util.List);基本类型会映射为对应包装类(int→java.lang.Integer) -
getGenericParameterTypes() 返回
Type[],保留泛型声明结构(如Map<String, User>仍表现为java.util.Map<java.lang.String, com.example.User>);需手动判断是否为ParameterizedType并调用getActualTypeArguments()提取真实泛型参数
返回类型:getReturnType() 与 getGenericReturnType()
逻辑同参数类型,但更常被误用:
-
getReturnType() 返回
Class<?>,适用于大多数类型判断和实例创建(如根据返回类型决定是否调用newInstance()) -
getGenericReturnType() 返回
Type,对泛型方法或泛型类中的方法至关重要。例如<T> T getValue(),getReturnType()返回Object.class,而getGenericReturnType()返回代表T的TypeVariable - 若方法返回数组类型(如
String[]),getReturnType()返回[Ljava.lang.String;这样的内部表示,可用Array.newInstance()或Class.getComponentType()辅助解析
异常列表:getExceptionTypes() 与 getGenericExceptionTypes()
异常类型在反射中容易被忽略,但对安全调用和异常拦截很关键:
-
getExceptionTypes() 返回
Class<?>[],只包含编译期声明的受检异常(throws IOException, SQLException),运行时异常(如RuntimeException)不会出现在该数组中 -
getGenericExceptionTypes() 同样返回
Type[],仅当异常类型本身含泛型时才有差异(如自定义泛型异常MyException<T>);实践中绝大多数情况二者内容一致 - 注意:异常声明不参与方法重载判定,但反射调用前可通过它预判是否需要
try-catch包裹
签名完整性:别漏掉修饰符和泛型形参
严格来说,“方法签名”还应包括访问修饰符、泛型形参(<T extends Number>)和方法名:
- 用
Modifier.toString(method.getModifiers())获取public static final等修饰符字符串 - 用
method.getTypeParameters()获取泛型形参数组(TypeVariable<Method>[]),每个可进一步提取名称、上界(getBounds()) -
method.toGenericString()是最省事的方式——它直接拼出接近源码的完整声明,含泛型、修饰符、异常,适合日志或调试输出

















