直接调用 method.isbridge() 即可判断——返回 true 就是桥接方法,false 则不是;它是编译器为泛型擦除或协变返回类型自动生成的合成方法,需用 getdeclaredmethods() 获取并筛选,字节码中带 bridge 和 synthetic 标志。

直接调用 method.isBridge() 即可判断——返回 true 就是桥接方法,false 则不是。这是最准确、最轻量的运行时识别方式。
桥接方法的典型特征
它不是你写的,而是编译器为兼容泛型擦除或协变返回类型自动生成的。常见于以下场景:
- 实现泛型接口(如
Comparable<string></string>)时,编译器补上compareTo(Object) - 继承泛型类并重写泛型方法(如
void process(T t)→ 补void process(Object o)) - 子类方法返回类型比父类更具体(协变返回),如父类返回
Object,子类返回String,编译器生成桥接方法维持多态调用链
反射中怎么拿到桥接方法
getMethods() 默认不包含桥接方法,因为它们属于“合成成员”,只对 JVM 运行有效。要检测它们,必须用:
-
clazz.getDeclaredMethods()—— 获取包括私有、桥接、合成在内的全部声明方法 - 再逐个调用
method.isBridge()筛选
例如:MyClass.class.getDeclaredMethods() 可能返回两个 compareTo 方法,其中参数为 Object 的那个 isBridge() 返回 true。
字节码层面的佐证
如果你用 javap -p MyClass.class 查看,桥接方法在输出中会明确标注:
- 访问标志含
bridge和synthetic - 方法体极简:通常只做类型强转 + 转发到真实方法,比如
return this.compareTo((String) o); - 参数类型更宽(常为
Object)、返回值更泛(也常为Object),而真实方法保留原始泛型类型
实际使用注意点
在框架开发(如 AOP、序列化、注解扫描)中容易踩坑:
- 注解不会自动继承到桥接方法上,所以
method.getAnnotation(MyAnn.class)在桥接方法上可能为null,但原始方法上有 - Spring 提供了
BridgeMethodResolver.findBridgedMethod(method)帮你反向定位原始方法 - 不要仅靠方法名和参数数量匹配逻辑,务必先用
isBridge()排除干扰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











