method.invoke()是java反射调用方法的核心api,需先通过class获取method对象(getdeclaredmethod支持私有方法并需setaccessible(true),getmethod仅限public方法),再传入目标实例(静态方法为null)和参数,注意类型匹配与异常处理。

Method.invoke() 是 Java 反射机制中调用对象方法的核心方式,它允许你在编译期未知具体类和方法名的情况下,于运行时动态执行目标方法。
获取 Method 对象
必须先通过 Class 对象获取目标方法的 Method 实例。关键点是:方法名、参数类型列表必须完全匹配(包括重载区分)。
- 用
clazz.getDeclaredMethod("methodName", paramTypes...)获取私有或公有方法(需配合setAccessible(true)访问私有方法) - 用
clazz.getMethod("methodName", paramTypes...)仅获取 public 方法(含父类继承的 public 方法) - 参数类型要用 Class 字面量,如
String.class、int.class、MyClass[].class
准备调用目标对象和参数
invoke() 的第一个参数是实际要执行方法的对象实例(即“调用者”),第二个及后续参数是该方法所需的实参值。
- 静态方法传
null作为第一个参数(如Method.invoke(null, args...)) - 实例方法必须传入非 null 的具体对象(如
Method.invoke(obj, "hello", 123)) - 基本类型参数会自动装箱;数组参数可直接传入,但注意类型匹配(如方法接收
String[],就传new String[]{"a","b"})
安全调用与异常处理
invoke() 声明抛出 IllegalAccessException、IllegalArgumentException、InvocationTargetException 三种检查异常,必须显式捕获。
-
IllegalAccessException:通常因未调用setAccessible(true)访问私有成员 -
IllegalArgumentException:参数个数/类型不匹配,或目标对象为 null(而方法是非静态) -
InvocationTargetException:被调用方法内部抛出了异常,其原始异常可通过e.getCause()获取
完整示例(调用带参数的私有实例方法)
假设有一个类:public class Calculator {<br>
private int add(int a, int b) { return a + b; }<br>
}
动态调用写法:
Calculator calc = new Calculator();
Class> clazz = calc.getClass();
Method method = clazz.getDeclaredMethod("add", int.class, int.class);
method.setAccessible(true); // 必须!否则 IllegalAccessException
Object result = method.invoke(calc, 10, 20); // 返回 Integer(30)










