zoukankan      html  css  js  c++  java
  • 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());
    }
    
  • 相关阅读:
    python学习之函数的参数
    python学习之文件修改及函数基础作业
    日志模块与 re 模块
    day23
    常用模块(二)
    day 22
    python 常用模块
    软件开发目录规范
    day 20
    python 的模块与包
  • 原文地址:https://www.cnblogs.com/sidesky/p/9287366.html
Copyright © 2011-2022 走看看