Java反射通过Class获取Method实例并动态调用,getMethod获取public方法(含继承),getDeclaredMethod获取本类任意权限方法(需setAccessible(true)调用private),invoke执行方法并处理异常。

Java 反射机制可以通过 Class 对象获取类的成员方法,并在运行时动态调用。核心是使用 java.lang.reflect.Method 类。
获取成员方法
通过 Class 对象的以下方法获取 Method 实例:
-
getMethod(String name, Class>... parameterTypes):获取 public 方法(包括父类继承的) -
getDeclaredMethod(String name, Class>... parameterTypes):获取本类声明的任意访问权限方法(不包括继承的),可访问 private 方法
示例:
Class> clazz = String.class;Method lengthMethod = clazz.getMethod("length"); // public 方法
Method valueFieldMethod = clazz.getDeclaredMethod("value"); // private 字段的 getter?注意:实际需对应存在且可访问
调用方法前的权限处理
若目标方法是 private 或受包访问限制,需先调用 setAccessible(true) 突破访问检查:
立即学习“Java免费学习笔记(深入)”;
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
- 对
getDeclaredMethod获取的私有方法,必须调用method.setAccessible(true)才能成功调用 -
getMethod获取的 public 方法无需此操作(但调用仍需传入合法对象实例)
注意:Java 9+ 默认开启强封装,某些 JDK 版本可能需添加 JVM 参数(如 --add-opens java.base/java.lang=ALL-UNNAMED)才能绕过模块限制。
执行方法调用
使用 Method.invoke(Object obj, Object... args) 执行:
- 第一个参数是方法所属的对象实例(static 方法可传 null)
- 后续参数按顺序传入方法所需的实参,类型自动装箱/拆箱,也可用
null表示引用类型参数 - 返回值为
Object,需按实际类型强制转换 - 抛出
IllegalAccessException、IllegalArgumentException、InvocationTargetException,需捕获处理
示例:
String str = "hello";Method length = String.class.getMethod("length");
int len = (int) length.invoke(str); // 返回 5
// 调用 private 方法(假设存在)
Method internalMethod = clazz.getDeclaredMethod("toLowerString");
internalMethod.setAccessible(true);
String result = (String) internalMethod.invoke(str);
批量获取与过滤方法
如需遍历或筛选方法,可用:
-
getMethods():获取所有 public 方法(含继承) -
getDeclaredMethods():获取本类所有声明的方法(含 private/static) - 结合
Method.getModifiers()和Modifier.isStatic()、Modifier.isPrivate()等判断修饰符
适合用于通用工具类(如对象拷贝、JSON 序列化)中自动发现 getter/setter 方法。

















