Java反射中method.isBridge() 桥接方法
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() 桥接方法相关推荐
- java反射中method类中的invoke方法是做什么的,他有什么作用?
就是调用类中的方法,最简单的用法是可以把方法参数化 invoke(class, method) 比如你Test类里有一系列名字相似的方法setValue1.setValue2等等 可以把方法名存进数组 ...
- JAVA深入研究——Method的Invoke方法。
在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...
- JAVA反射中的Accessible
package demo.reflection;import java.lang.reflect.Field; import java.lang.reflect.Method;class A{priv ...
- java反射中,Class.forName和classloader的区别
http://blog.csdn.net/qq_27093465/article/details/52262340 转载于:https://www.cnblogs.com/newlangwen/p/7 ...
- Java 桥接方法(Bridge Method)
目录 重写方法的返回类型是其父类返回类型的子类型 重写泛型方法生成桥接 什么是「桥接方法」,下面来从两个例子中体会一下. 重写方法的返回类型是其父类返回类型的子类型 public class Merc ...
- [译] Java 桥接方法详解
原文地址:Java bridge methods explained 原文作者:STAS 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:kezhenxu9 ...
- 3分钟快速搞懂Java的桥接方法
什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥 ...
- 在 Java 的反射中,Class.forName 和 ClassLoader 的区别
前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...
- java中如何使用反射调用方法以及获得类中的属性
使用反射获取类中的方法: 1):获取方法所在类的字节码对象. 2):获取方法. ------------------------------------------------------------ ...
最新文章
- TP框架中field查询字段
- 印度太阳能企业争取对中、台、马实施反倾销税
- linux查看CPU利用率与负载,Linux CPU负载利用率统计
- 判断数组有哪些方法,100%准确的方法
- Chmod 提升一个文件夹下所有文件(夹)的权限
- 计算机国际安全顶级会议
- 使用 Flink Hudi 构建流式数据湖
- Java面向对象练习题之学生信息
- memcache_engine + memcachedb = 高性能分布式内存数据库
- io hang linux 原理,Linux 避免IO hang
- zz backgroundworker C#
- 4.设计包(design package)
- MySQL常用语句、连接MySQL格式:mysql-h主机地址-u用户名-p用户密 (详细篇 修改版)
- Linux Centos快速屏蔽IP访问(iptables)
- VScode 下载、安装和设置中文界面
- 孩子学python_教孩子学编程 Python
- android日记app常用,只是意外 - 用这些 APP 来记录生活,再也不用担心无法坚持写日记 - Android 应用 - 【最美应用】...
- 传媒论坛杂志传媒论坛杂志社传媒论坛编辑部2022年第13期目录
- JS复制input内容
- php利用堆栈 实现高级计算器