java method.isBridge

作者:木女孩
链接:https://www.zhihu.com/question/54895701/answer/141623158
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

考虑下面的接口和实现
public interface AInterface<T> {
    void func(T t);
}
public class AClass implements AInterface<String> {
    @Override
    public void func(String s) {
        System.out.println(s);
    }
}
Java的泛型是要擦除的,虚拟机不认这个玩意儿,那么问题来了,AInterface中的func方法的参数在虚拟机中是什么?只能是Object了吧,还能是其他东西?
于是它其实是这样的
public interface AInterface {
    void func(Object t);
}

问题又来了,AClass实现了AInterface接口,来看看现在的AClass是什么样的
public class AClass implements AInterface {
    public void func(String s) {
        System.out.println(s);
    }
}
这根本就没有实现void func(Object)方法嘛,那是怎么解决的呢?编译器给生成了一个方法,喂给虚拟机时,AClass长下面这样
public class AClass implements AInterface {
    public void func(String s) {
        System.out.println(s);
    }
    public void func(Object s) {
         this.func((String) s);
    }

}
新生成的这个方法就是桥接方法。
我们可以看到这个方法
javap -p AClass.class
当然了,反射可以搞到这个方法
public static void main(String[] args) throws Exception {
    AClass obj = new AClass();
    Method func = AClass.class.getMethod("func", String.class);
    func.invoke(obj, "AAA");
    System.out.println(func.isBridge());
    func = AClass.class.getMethod("func", Object.class);
    func.invoke(obj, "BBB");
    System.out.println(func.isBridge());
}
原文地址:https://www.cnblogs.com/sidesky/p/9287366.html