Java反射调用方法的核心是通过Class获取Method对象后调用invoke(),需注意:1.用getMethod()查public方法(含父类),getDeclaredMethod()查本类所有方法(含private);2.参数类型必须精确匹配;3.private方法需setAccessible(true);4.invoke()第一个参数为对象实例(静态方法传null),异常被包装为InvocationTargetException。

Java反射调用方法,核心是通过 Class 获取目标类的 Method 对象,再用 invoke() 执行。关键在于正确获取方法(考虑重载、访问权限)、处理参数类型匹配和异常。
获取 Method 对象
用 getDeclaredMethod() 或 getMethod() 获取方法引用:
-
getMethod("methodName", paramTypes...)只找 public 方法(含父类) -
getDeclaredMethod("methodName", paramTypes...)找本类所有方法(含 private/protected),但不查父类 - 参数类型必须精确匹配——
String.class不能写成Object.class,否则抛NoSuchMethodException - 重载方法靠参数类型区分,比如
print(String)和print(int)是两个不同 Method
设置可访问性(尤其 private 方法)
对非 public 方法,需显式设为可访问:
- 调用
method.setAccessible(true),跳过 JVM 访问检查 - 该操作在模块化(Java 9+)环境下可能受模块限制,需在
module-info.java中声明opens或使用--add-opensJVM 参数
执行 invoke() 调用
method.invoke(obj, args...) 执行方法:
立即学习“Java免费学习笔记(深入)”;
- 第一个参数是目标对象(
null表示静态方法) - 后续参数按顺序传入,类型自动装箱/拆箱(如 int ↔ Integer),但不能跨继承层级强转(如传
ArrayList给要求List的参数通常可以,但传String给Number就不行) - 抛出的异常会被包装进
InvocationTargetException,需用e.getCause()获取原始异常
完整小例子
假设有类:class Demo { private String hello(String s) { return "Hi, " + s; } }
反射调用它:
Class> clazz = Demo.class;Method m = clazz.getDeclaredMethod("hello", String.class);m.setAccessible(true);Object result = m.invoke(new Demo(), "world"); // 返回 "Hi, world"
基本上就这些。不复杂但容易忽略参数类型和访问控制细节。











