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

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

假定接口

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

它的一个实现类

public class AClass implements SuperClass<String> {@Overridepublic 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<java.lang.String> {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());}

测试结果如下

XXXXXXXXXXXXXXXXXX
false
##################
true

转载于:https://www.cnblogs.com/handsome1013/p/10275727.html

Java反射中method.isBridge() 桥接方法相关推荐

  1. java反射中method类中的invoke方法是做什么的,他有什么作用?

    就是调用类中的方法,最简单的用法是可以把方法参数化 invoke(class, method) 比如你Test类里有一系列名字相似的方法setValue1.setValue2等等 可以把方法名存进数组 ...

  2. JAVA深入研究——Method的Invoke方法。

    在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...

  3. JAVA反射中的Accessible

    package demo.reflection;import java.lang.reflect.Field; import java.lang.reflect.Method;class A{priv ...

  4. java反射中,Class.forName和classloader的区别

    http://blog.csdn.net/qq_27093465/article/details/52262340 转载于:https://www.cnblogs.com/newlangwen/p/7 ...

  5. Java 桥接方法(Bridge Method)

    目录 重写方法的返回类型是其父类返回类型的子类型 重写泛型方法生成桥接 什么是「桥接方法」,下面来从两个例子中体会一下. 重写方法的返回类型是其父类返回类型的子类型 public class Merc ...

  6. [译] Java 桥接方法详解

    原文地址:Java bridge methods explained 原文作者:STAS 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:kezhenxu9 ...

  7. 3分钟快速搞懂Java的桥接方法

    什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥 ...

  8. 在 Java 的反射中,Class.forName 和 ClassLoader 的区别

    前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...

  9. java中如何使用反射调用方法以及获得类中的属性

    使用反射获取类中的方法: 1):获取方法所在类的字节码对象. 2):获取方法. ------------------------------------------------------------ ...

最新文章

  1. TP框架中field查询字段
  2. 印度太阳能企业争取对中、台、马实施反倾销税
  3. linux查看CPU利用率与负载,Linux CPU负载利用率统计
  4. 判断数组有哪些方法,100%准确的方法
  5. Chmod 提升一个文件夹下所有文件(夹)的权限
  6. 计算机国际安全顶级会议
  7. 使用 Flink Hudi 构建流式数据湖
  8. Java面向对象练习题之学生信息
  9. memcache_engine + memcachedb = 高性能分布式内存数据库
  10. io hang linux 原理,Linux 避免IO hang
  11. zz backgroundworker C#
  12. 4.设计包(design package)
  13. MySQL常用语句、连接MySQL格式:mysql-h主机地址-u用户名-p用户密 (详细篇 修改版)
  14. Linux Centos快速屏蔽IP访问(iptables)
  15. VScode 下载、安装和设置中文界面
  16. 孩子学python_教孩子学编程 Python
  17. android日记app常用,只是意外 - 用这些 APP 来记录生活,再也不用担心无法坚持写日记 - Android 应用 - 【最美应用】...
  18. 传媒论坛杂志传媒论坛杂志社传媒论坛编辑部2022年第13期目录
  19. JS复制input内容
  20. php利用堆栈 实现高级计算器

热门文章

  1. 令人苦恼的调试缓慢问题
  2. [译]BEAST还是一个威胁吗?
  3. 运动背景下的运动目标检测
  4. Nginx安全配置研究
  5. bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
  6. 【WPF-Devexpress】ChartControl-CrosshairLabel显示内容居右
  7. Docker容器固定IP分配
  8. SQL Plan Management介绍
  9. 【分块答案】【最小割】bzoj1532 [POI2005]Kos-Dicing
  10. spring 初始化数据库