博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射中method.isBridge() 桥接方法
阅读量:4641 次
发布时间:2019-06-09

本文共 1607 字,大约阅读时间需要 5 分钟。

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

 假定接口 

public interface SuperClass
{ void method(T t);}

它的一个实现类

public class AClass implements SuperClass
{ @Override public void method(String s) {
    System.out.println(s);   } }

因为泛型是在1.5引入的,为了向前兼容,所以会在编译时去掉泛型(泛型擦除)。那么SuperClass接口中的method方法的参数在虚拟机中只能是Object。

它应该是这个样子:

public interface SuperClass {    void method(Object  t);}

 而 AClass 实现了SuperClass 接口,但是它的实现方法却是:

public void method(String s) {    System.out.println(s);  }

根本就没有实现 void method(Object t) 方法。 这怎么回事,其实虚拟机自动实现了一个方法。

AClass在虚拟机中是这个样子:

public class AClass implements SuperClass  {    public void method(String s) {        System.out.println(s);    }    public void method(Object s) {         this.method((String) s);    }}

这个void method(Object s)  就是桥接方法。

我们用这个命令查看

javap -p AClass.class

显示如下:

Compiled from "AClass.java"public class AClass implements SuperClass
{ public AClass(); public void method(java.lang.String); public void method(java.lang.Object);}

 我们用反射写个测试,看结果如何

public static void main(String[] args) throws Exception {        AClass obj = new AClass();        Method m = AClass.class.getMethod("method", String.class);        m.invoke(obj, "XXXXXXXXXXXXXXXXXX");        System.out.println(m.isBridge());        m = AClass.class.getMethod("method", Object.class);        m.invoke(obj, "##################");        System.out.println(m.isBridge());    }

测试结果如下

XXXXXXXXXXXXXXXXXXfalse##################true

 

转载于:https://www.cnblogs.com/zsg88/p/7588929.html

你可能感兴趣的文章
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>
Linux的学习:
查看>>
JavaScript中的原型继承原理
查看>>
Python logger模块
查看>>
jquery控制css的display(控制元素的显示与隐藏)
查看>>
关于python做人工智能的一个网页(很牛逼)
查看>>
判断控件的CGRect是否重合,获取控件的最大XY值
查看>>
POJ-1128 Frame Stacking
查看>>
浏览器调试淘宝首页看到有趣的招聘信息
查看>>
ASP.NET Identity “角色-权限”管理 4
查看>>
[转][译]ASP.NET MVC 4 移动特性
查看>>
SOC CPU
查看>>
get_result --perl
查看>>
163镜像地址
查看>>
ehcache memcache redis 三大缓存男高音
查看>>
eclipse 快捷键Open Implementation 直接退出
查看>>
minix中管道文件和设备文件的读写
查看>>