class.getmethods()返回当前类及其所有父类和实现接口中所有public方法,包括object中的tostring()等,但不包含protected、private及package-private方法。

Class.getMethods() 方法本身就会返回当前类及其所有父类(包括接口)中所有 public 方法的数组,包括从 Object 继承的如 toString()、equals()、hashCode() 等。
getMethods() 的作用范围
它不是只查当前类,而是递归向上查找整个继承链(类继承 + 接口实现),只要方法是 public 且可访问(即未被 private 或 package-private 阻断),就会包含在结果中。
- 包含当前类定义的 public 方法
- 包含直接父类、祖父类……直到
Object中的 public 方法 - 包含该类直接或间接实现的所有接口中的 public 方法(接口方法默认 public)
- 不包含 protected、private、package-private 方法
- 不包含静态方法?——会包含,只要它是 public static(例如
String.valueOf())
注意:不包含非 public 继承的方法
比如父类有一个 protected void foo(),子类没重写,那么 getMethods() 不会返回它。因为 getMethods() 只返回 运行时能被外部调用的 public 方法,而 protected 方法在子类外不可见,不满足“public 可访问”条件。
如果需要获取本类声明的所有方法(含 private/protected),用 getDeclaredMethods();若要连同父类的 declared 方法一起获取,需手动遍历继承链。
简单示例
假设:
class A { public void a() {} }
class B extends A { public void b() {} }
执行 B.class.getMethods() 返回的方法数组包含:
-
b()(B 自己定义) -
a()(从 A 继承) -
toString()、equals(Object)、hashCode()、getClass()、notify()、notifyAll()、wait()及重载版本(来自 Object)
常见误区
有人误以为 getMethods() 会返回父类的 protected 方法,或认为它需要配合 getSuperclass() 手动遍历——其实不需要。JVM 已自动完成完整 public 方法集的合并。
如果发现结果里没有某个预期的 public 方法,请检查:
- 该方法是否确实是
public(不是 default/protected/private) - 是否被重载但签名不同(泛型擦除后可能冲突)
- 是否在接口中定义但该类未实现(此时不会出现)
- 是否属于某个父接口但当前类未显式实现(若父类已实现,则仍会出现在结果中)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











