java反射调用方法的核心是method.invoke(),需先通过class获取method对象,区分getmethod(仅public)和getdeclaredmethod(含private等),私有方法须setaccessible(true),静态方法传null作目标实例,参数类型须匹配,异常需捕获处理,返回值为object需手动强转。

Java 中通过反射调用对象的方法,核心是使用 Method.invoke()。它允许你在运行时动态获取并执行某个类的成员方法,无需编译期确定具体方法名或参数类型。
获取 Method 对象
必须先通过 Class 对象拿到目标方法的 Method 实例。注意区分 public 方法和非 public 方法:
- 调用
getDeclaredMethod("methodName", paramTypes...)可获取包括 private、protected、package-private 的方法(但不包含继承来的 public 方法) - 调用
getMethod("methodName", paramTypes...)只能获取当前类及其父类中声明为 public 的方法 - 若方法是 private 或受访问限制,需先调用
method.setAccessible(true)禁用访问检查
准备目标对象和参数
invoke() 第一个参数是方法要执行的目标实例(即 this),第二个及后续参数是该方法的实际入参:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 静态方法传入
null作为第一个参数(如method.invoke(null, args...)) - 实例方法必须传入对应类型的对象实例(不能为 null,除非该方法内部不依赖 this)
- 参数类型必须与方法签名严格匹配,基本类型需自动装箱(如 int → Integer),或使用对应包装类数组
调用 invoke 并处理异常
Method.invoke() 声明抛出三个受检异常,实际使用中需统一捕获处理:
-
IllegalAccessException:访问权限不足(比如没调setAccessible(true)) -
IllegalArgumentException:参数个数/类型不匹配,或目标对象类型错误 -
InvocationTargetException:被调用方法内部抛出异常,可通过e.getCause()获取原始异常
推荐写法:
try {Object result = method.invoke(targetObj, arg1, arg2);
} catch (InvocationTargetException e) {
throw e.getCause(); // 透出原业务异常
} catch (Exception e) {
// 处理 IllegalAccessException / IllegalArgumentException
}
注意返回值和泛型擦除
invoke() 返回值类型为 Object,需根据方法实际返回类型手动强转:
- void 方法返回
null - 基本类型返回对应包装类(如
int→Integer),可调用xxxValue()转回原始类型 - 泛型信息在运行时已擦除,无法通过反射直接获取泛型返回类型,需靠调用方约定或额外元数据辅助
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










