• 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());
    }
    
  • 相关阅读:
    丑数系列
    452. 用最少数量的箭引爆气球
    406. 根据身高重建队列
    763. 划分字母区间
    所有二叉树题目记录
    二叉树前中后序遍历非递归(迭代)解法
    二叉树的层序遍历题目汇总
    442. 数组中重复的数据&&448. 找到所有数组中消失的数字
    225. 用队列实现栈(Easy)
    使用ClosedXML读写excel
  • 原文地址:https://www.cnblogs.com/sidesky/p/9287366.html
Copyright © 2020-2023  润新知