Java中静态方法可通过反射调用,需用null作为invoke首个参数;获取Class用MyClass.class或Class.forName();getMethod仅获public方法,getDeclaredMethod可获所有方法(含private,需setAccessible(true))。

可以,Java 中静态方法完全可以通过反射获取并调用。关键在于理解静态成员属于类本身,而非实例,因此反射调用时需特别处理参数和访问权限。
获取静态方法的 Class 对象
必须先拿到目标类的 Class 实例,常用方式有:
-
MyClass.class—— 最简洁,编译期已知类时推荐 -
Class.forName("com.example.MyClass")—— 运行时动态加载,需传完整类名(含包路径) -
obj.getClass()—— 仅适用于已有实例,不推荐用于纯静态场景
获取 Method 对象要选对方法
区分 getMethod() 和 getDeclaredMethod():
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
getMethod("methodName", paramTypes...)只能获取 public 的静态方法(包括继承自父类的) -
getDeclaredMethod("methodName", paramTypes...)可获取当前类中所有静态方法,无论public、private或protected - 若目标方法是
private static,后续必须调用method.setAccessible(true)才能绕过访问检查
调用时第一个参数必须为 null
这是静态方法反射调用最核心的约定:
立即学习“Java免费学习笔记(深入)”;
-
method.invoke(null, args...)——null明确表示“不依赖任何实例”,由 JVM 按类级别执行 - 传入非
null实例(如method.invoke(new MyClass(), ...))虽不报错,但语义错误,可能引发意外行为 - 返回值类型需按实际方法声明做强制转换,例如
(String) method.invoke(null)
静态变量同理,也靠 null 参数操作
读写静态字段同样遵循类级别逻辑:
-
field.get(null)读取静态变量值 -
field.set(null, newValue)修改静态变量值 - 私有静态字段同样需要
field.setAccessible(true)

















