getmethods() 返回当前类及其所有父类中所有 public 修饰的方法(包括 object 的 tostring、equals 等),不包含 private、protected 或包级方法;返回 method[],需调用 getname() 获取方法名,但重载方法仅靠 getname() 无法区分。

直接用 getMethods() 就能拿到所有公开方法名,但要注意它包含继承来的(比如 Object 的 toString、equals),而且不返回私有/保护/包级方法。
getMethods() 返回的是哪些方法?
它只返回当前类及其所有父类中 public 修饰的方法,包括从 Object 继承的。不会返回 private、protected 或默认访问权限的方法,哪怕它们在本类里声明了。
-
getMethods()返回Method[],每个元素调用getName()即可得方法名 - 结果里常见冗余项:
wait、notify、hashCode、getClass等——它们来自Object,不是你写的 - 如果目标是“本类定义的公开方法”,这个 API 不满足,得配合
getDeclaringClass()过滤
怎么过滤出“本类定义”的 public 方法?
因为 getMethods() 混了继承链上的方法,想只看当前类自己写的 public 方法,得逐个检查 Method.getDeclaringClass() 是否等于目标类。
- 示例:对
MyService.class调用getMethods()后,遍历每个method,写method.getDeclaringClass() == MyService.class判断 - 注意不要用
==比较类名字符串,容易出错;用 Class 对象引用相等最可靠 - 如果类继承了接口,接口的 default 方法也会被
getMethods()包含,且getDeclaringClass()返回的是接口类型,可据此区分
为什么不用 getDeclaredMethods()?
getDeclaredMethods() 确实只返回本类声明的所有方法(含 private),但它**不返回 public 继承方法**——而这恰恰是你要的“所有公开方法名”的一部分。
- 如果你只需要“本类自己定义的全部方法名”,用
getDeclaredMethods()更干净 - 但题目明确要“所有公开方法名”,那就必须接受继承带来的噪声,或手动合并
getDeclaredMethods()中的public方法 +getMethods()中声明类不等于本类的那些public方法 - 性能上无显著差异;但逻辑复杂度上升,多数场景直接用
getMethods()并接受Object方法的存在更实际
真正容易被忽略的是:方法签名相同但参数类型不同的重载方法,getMethods() 会把它们全列出来,名字一样但 toString() 输出不同——别只靠 getName() 去重,否则会漏掉重载变体。










