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());
    }
    
  • 相关阅读:
    Tensorflow2.0学习(3)---基础
    Tensorflow2.0学习(2)---线性回归和分类
    Tensorflow2.0学习(1)---简介
    人工智能、机器学习、深度学习区别
    window10安装tensorflow2
    conda创建虚拟环境报错
    ubuntu18的firefox安装flash插件
    Shell学习(1)---脚本入门
    检测服务器端口是否被封(墙)
    git 查看远程仓库地址
  • 原文地址:https://www.cnblogs.com/sidesky/p/9287366.html
Copyright © 2011-2022 走看看