Java反射中method.isBridge() 桥接方法

桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法。我们可以通过Method.isBridge()方法来判断一个方法是否是桥接方法。

 假定接口 

public interface SuperClass<T> {
    void method(T t);
}

它的一个实现类

public class AClass implements SuperClass<String> {
    @Override
    public void method(String s) {
    System.out.println(s);
  }
}

因为泛型是在1.5引入的,为了向前兼容,所以会在编译时去掉泛型(泛型擦除)。那么SuperClass接口中的method方法的参数在虚拟机中只能是Object。

它应该是这个样子:

public interface SuperClass {
    void method(Object  t);
}

 而 AClass 实现了SuperClass 接口,但是它的实现方法却是:

    public void method(String s) {
    System.out.println(s);
  } 

根本就没有实现 void method(Object t) 方法。 这怎么回事,其实虚拟机自动实现了一个方法。

AClass在虚拟机中是这个样子:

public class AClass implements SuperClass  {
    public void method(String s) {
        System.out.println(s);
    }
    public void method(Object s) {
         this.method((String) s);
    }
}

这个void method(Object s)  就是桥接方法。

我们用这个命令查看

javap -p AClass.class

显示如下:

Compiled from "AClass.java"
public class AClass implements SuperClass<java.lang.String> {
  public AClass();
  public void method(java.lang.String);
  public void method(java.lang.Object);
}

 我们用反射写个测试,看结果如何

复制代码
    public static void main(String[] args) throws Exception {
        AClass obj = new AClass();
        Method m = AClass.class.getMethod("method", String.class);
        m.invoke(obj, "XXXXXXXXXXXXXXXXXX");
        System.out.println(m.isBridge());
        m = AClass.class.getMethod("method", Object.class);
        m.invoke(obj, "##################");
        System.out.println(m.isBridge());
    }
复制代码

测试结果如下

XXXXXXXXXXXXXXXXXX
false
##################
true

 

posted @   猪脚踏浪  阅读(8506)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示