作者:木女孩
链接: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());
}

java method.isBridge的更多相关文章

  1. Java反射中method.isBridge() 桥接方法

    桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法.我们可以通过Method.isBridge()方法来判断一个方法是 ...

  2. Java Method Logging with AOP and Annotations

    Sometimes, I want to log (through slf4j and log4j) every execution of a method, seeing what argument ...

  3. 测者的测试技术手册:揭开java method的一个秘密--巨型函数

    揭开java method的一个秘密:巨型函数 相信,很多人都不知道Java的Method的上限为64K.本文将超过这个上限的函数叫做巨型函数. 巨型函数的问题 1.如果代码超过了这个限制,Java编 ...

  4. Calling a Java Method from Native Code

    http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html Calling Java Method ...

  5. 测者的测试技术笔记:揭开java method的一个秘密--巨型函数

    相信,很多人都不知道Java的Method的上限为64K.本文将超过这个上限的函数叫做巨型函数. 巨型函数的问题 1.如果代码超过了这个限制,Java编译器就报"Code too large ...

  6. Java Method Area

    ref http://blog.csdn.net/huangfan322/article/details/53220169 https://docs.oracle.com/javase/specs/j ...

  7. java --Method

    MethodDemo class MethodDemo { public static void main(String[] args) { //调用自定义的方法. draw(4,5); draw(8 ...

  8. 【java编程】java中什么是bridge method(桥接方法)

    https://blog.csdn.net/mhmyqn/article/details/47342577 https://www.cnblogs.com/strinkbug/p/5019453.ht ...

  9. Java基础之Bridge method(桥接方法)

    1.什么是桥接方法 桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法. 判断方法 我们可以通过 Method.isB ...

随机推荐

  1. P2016 战略游戏

    传送门 思路: 前置知识——普通树D: ▲普通的树形 DP : 设 f [ i ][ 0 ] 表示这个点不取,则它的所有子节点都要取:f [ i ][ 1 ] 表示这个点取,则它的子节点取与不取对之前 ...

  2. 下载安装Android sdk tools

    安装java: https://www.cnblogs.com/sea-stream/p/5815957.html 下载地址:https://www.androiddevtools.cn/ 选择版本 ...

  3. NET Core 指令启动

    ASP.NET Core 是新一代的 ASP.NET,早期称为 ASP.NET vNext,并且在推出初期命名为ASP.NET 5,但随着 .NET Core 的成熟,以及 ASP.NET 5的命名会 ...

  4. Linux简单入门

    1.目录切换命令 cd usr 切换到该目录下usr目录 cd ../ 切换到上一层目录 cd / 切换到系统根目录 cd ~ 切换到用户主目录 cd - 切换到上一个所在目录 2.目录的操作命令 1 ...

  5. vue组件定义全局方法

    1.在vue实例的data中定义一个对象 2.可以在其他组件定义方法 3.触发方法

  6. Codeforces 600 E - Lomsat gelral

    E - Lomsat gelral 思路1: 树上启发式合并 代码: #include<bits/stdc++.h> using namespace std; #define fi fir ...

  7. jGrid + echart 后台管理

    用来初始化表的大小: $(select_dom).jqGrid( 'setGridWidth', parent_column.width() ); 表的大小随着页面的宽度变化: $(window).o ...

  8. MySQL Connector/J

    5.1 Developer Guide 1. MysQL为由Java语言编程的客户端程序提供连接:MySQL Connector/J,这是一个实现Java Database Connectivity( ...

  9. spring cloud: 关闭ribbon负载均衡

    spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...

  10. 20165327 2017-2018-2 《Java程序设计》第2周学习总结

    20165327 2017-2018-2 <Java程序设计>第2周学习总结 内容:教材第2.3章 内容小结: (一)标识符由字母.下划线.美元符号和数字组成, 并且第一个字符不能是数字字 ...