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)。
处理 null 参数时必须手动指定类型
null 没有运行时类型,反射无法推断。以下写法会抛 NoSuchMethodException:
// ❌ 错误:无法从 null 推出 String.class
getMethod("print", null);
// ✅ 正确:显式声明类型
getMethod("print", String.class).invoke(obj, (String) null);
如果参数为 null 且类型是泛型或继承关系复杂(如 List vs ArrayList),务必按方法签名中声明的**最左类型**(即形参类型)传入 Class 对象。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
私有重载方法需先 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。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










