Java反射调用重载方法必须显式指定参数类型数组,严格匹配形参的顺序、个数和类型;基本类型用int.class而非Integer.class,varargs参数用String[].class;不确定时可先获取所有同名方法再比对筛选。

Java反射调用重载方法时,不能只靠方法名,必须明确指定参数类型——因为JVM在运行期无法仅凭方法名和实参值自动推断该调用哪一个重载版本。
核心原则:用Class数组精准匹配参数类型
反射中获取方法靠 Class.getMethod(String name, Class... parameterTypes) 或 getDeclaredMethod。关键在于第二个参数必须传入一个 Class对象数组,严格对应目标重载方法的形参类型(顺序、个数、类型三者缺一不可)。
- 例如有:
void print(String s)和void print(int i),要调用前者就得传new Class[]{String.class},后者则用new Class[]{int.class} - 如果传
new Class[]{Integer.class}去找print(int i),会抛 NoSuchMethodException——因为Integer.class ≠ int.class - 基本类型必须用对应原始类型 Class(
int.class),不能用包装类(Integer.class),除非方法签名本身定义的就是包装类
处理自动装箱/拆箱场景需格外小心
编译器在普通代码中能自动处理 int ↔ Integer,但反射不参与这一过程。它只做字面匹配。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若方法是
void log(Integer x),反射调用必须用Integer.class - 若方法是
void log(int x),反射调用必须用int.class - 两者互不兼容,哪怕你传的是
5这个实参值,反射也看不到“它可以转成 int 或 Integer”
遇到可变参数(varargs)要特别注意
声明为 void action(String... args) 的方法,在反射中其最后一个参数类型是 String[].class,不是 String.class。
立即学习“Java免费学习笔记(深入)”;
- 正确写法:
getMethod("action", String[].class) - 错误写法:
getMethod("action", String.class)(找不到)或getMethod("action")(零参数版,不是 varargs 版) - 如果同时存在
action(String s)和action(String... args),它们构成重载,必须分别用String.class和String[].class区分
实用技巧:先获取所有同名方法再筛选
当不确定具体签名,或想动态适配多种调用可能时,可以先用 getMethods() 或 getDeclaredMethods() 拿到全部同名方法,再遍历比对 method.getParameterTypes() 数组是否与目标参数类型数组一致。
- 适合封装通用反射工具类
- 可配合
Class.isAssignableFrom()支持一定范围的类型兼容判断(如子类实参匹配父类形参) - 但要注意:这仍是手动逻辑,反射本身不做自动重载解析

















