Java反射调用重载方法必须显式指定参数类型数组,用getMethod()或getDeclaredMethod()精确获取方法,再invoke()调用;JVM不自动推导重载版本,null参数需手动声明类型,私有方法需setAccessible(true),基本类型与包装类视为不同签名。

Java 反射调用重载方法的关键在于:**必须显式指定参数类型数组,用 getMethod() 或 getDeclaredMethod() 精确获取目标方法对象,再通过 invoke() 调用**。JVM 不会自动推导重载版本,仅靠参数值无法唯一确定方法。
明确传入 Class 类型数组匹配重载签名
反射不看实际参数值的运行时类型(如 null),而是严格比对声明的参数类型。例如有以下重载:
public void print(String s) { ... }
public void print(Integer i) { ... }
public void print(Object o) { ... }
要调用 print(String),必须写:
method = obj.getClass().getMethod("print", String.class);
method.invoke(obj, "hello");
若传 new Class[]{Object.class},即使实参是字符串,也会匹配到 print(Object)。
立即学习“Java免费学习笔记(深入)”;
处理 null 参数时必须手动指定类型
null 没有运行时类型,反射无法推断。以下写法会抛 NoSuchMethodException:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// ❌ 错误:无法从 null 推出 String.class
getMethod("print", null);
// ✅ 正确:显式声明类型
getMethod("print", String.class).invoke(obj, (String) null);
如果参数为 null 且类型是泛型或继承关系复杂(如 List vs ArrayList),务必按方法签名中声明的**最左类型**(即形参类型)传入 Class 对象。
私有重载方法需先 setAccessible(true)
若目标方法是 private,需用 getDeclaredMethod() 并绕过访问检查:
Method method = clazz.getDeclaredMethod("doWork", int.class, String.class);
method.setAccessible(true); // 关键一步
method.invoke(instance, 42, "test");
注意:getDeclaredMethod() 不查找父类方法,若重载在父类中,仍要用 getMethod();若在当前类且为 private,则必须用 getDeclaredMethod()。
避免自动装箱/拆箱干扰匹配
基本类型和包装类是不同签名。例如:
void calc(int x) void calc(Integer x)
调用 calc(5) 时,反射中必须明确选其一:
- 匹配
int:用int.class,传5(自动装箱不影响反射匹配) - 匹配
Integer:用Integer.class,传Integer.valueOf(5)或5(此时会自动装箱,但前提是类型已指定为Integer.class)
混用会导致 NoSuchMethodException 或 IllegalArgumentException。

















