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()); } 

猜你喜欢

转载自www.cnblogs.com/sidesky/p/9287366.html