静态方法可通过反射调用:先用Class.forName获取Class对象,再用getDeclaredMethod或getMethod获取Method对象,最后以null为调用目标执行invoke(null, args)。

静态方法不能直接通过 Class.forName 获取实例后调用,因为静态方法属于类本身,不依赖对象实例。但可以通过反射获取 Method 对象,再用 invoke(null, ...) 调用——关键点是传入 null 作为调用目标。
1. 获取 Class 对象
Class.forName("全限定类名") 返回的是该类的 Class 对象,仅用于反射入口,不创建实例。
- 确保类在类路径中,且类名字符串正确(如
"java.lang.Math") - 若类未加载或类名错误,会抛出
ClassNotFoundException
2. 获取静态 Method 对象
使用 getDeclaredMethod 或 getMethod 查找目标静态方法:
-
getMethod("methodName", paramTypes...)只查 public 方法(含继承的) -
getDeclaredMethod("methodName", paramTypes...)查所有声明的方法(包括 private、static),但需配合setAccessible(true)才能访问非 public 方法 - 参数类型必须精确匹配,如
int.class、String.class,不能写成int或Integer.class(基本类型和包装类不同)
3. 调用静态方法
调用时传入 null 作为第一个参数(表示无接收对象),后续参数为方法实际参数:
立即学习“Java免费学习笔记(深入)”;
- 例如调用
Math.max(int, int):method.invoke(null, 10, 20) - 若方法有异常(如 checked exception),
invoke会封装为InvocationTargetException,需捕获并处理其getCause() - 返回值是
Object,需按实际类型强转(如(int) result)
4. 完整示例
调用 java.util.Arrays.toString(int[]):
try {
Class<?> clazz = Class.forName("java.util.Arrays");
Method method = clazz.getDeclaredMethod("toString", int[].class);
Object result = method.invoke(null, new int[]{1, 2, 3});
System.out.println(result); // 输出: [1, 2, 3]
} catch (Exception e) {
e.printStackTrace();
}


















