最准确轻量的桥接方法过滤方式是直接用Method.isBridge()判断。因桥接方法与真实方法名和参数数量可能相同,但签名(如返回类型、泛型擦除)不同,仅靠名称或参数个数易误判;标准写法为Arrays.stream(clazz.getDeclaredMethods()).filter(m -> !m.isBridge()).toArray(Method[]::new),可叠加!m.isSynthetic()增强过滤但非必需;常见错误包括按名分组去重导致ClassCastException、主动查桥接方法在混淆环境下失效、忽略返回类型引发强转失败;推荐流程是先获取声明方法、立即过滤桥接方法、再按完整签名查找,高频场景应缓存非桥接方法映射。

直接用 Method.isBridge() 判断并过滤,是最准确、最轻量的方式。
为什么必须用 isBridge() 而不是看方法名或参数
桥接方法和真实方法名称相同、参数数量可能也一样,但签名不同(比如返回类型是 Object 而非 String,参数类型是原始 List 而非 List<string></string>)。仅靠名字或参数个数无法区分,容易误判或漏判。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
标准过滤写法
遍历前加一层筛选即可:
Arrays.stream(clazz.getDeclaredMethods()).filter(m -> !m.isBridge()).toArray(Method[]::new)- 如需更严格,可叠加
!m.isSynthetic()排除 lambda 等其他合成方法,但注意:桥接方法不一定标记为 synthetic,isBridge() 才是唯一权威标识
常见误操作及后果
- 只按方法名分组去重 → 会把桥接方法和真实方法当成同一个,导致后续调用传错参数类型,抛
ClassCastException或NoSuchMethodException - 用
getDeclaredMethod("xxx", Object.class)主动查桥接方法 → 在 R8/ProGuard 等优化环境下可能已被移除,直接找不到,引发 fallback 异常 - 忽略返回类型匹配 → 反射调用时选中桥接方法,实际执行的是委托逻辑,但强转失败或语义不符
推荐的反射调用流程
- 先获取所有声明方法:
clazz.getDeclaredMethods() - 立即过滤:
Stream.of(...).filter(m -> !m.isBridge()).toList() - 再按完整签名查找:
clazz.getDeclaredMethod("name", String.class),它内部已跳过桥接方法 - 高频场景建议缓存非桥接方法映射,避免每次重复过滤

















