桥接方法(转)

转载地址:https://blog.csdn.net/mhmyqn/article/details/47342577

在看spring-mvc的源码的时候,看到在解析handler方法时,有关于获取桥接方法代码,不明白什么是桥接方法,经过查找资料,终于理解了什么是桥接方法。

什么是桥接方法

桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法。

我们可以通过Method.isBridge()方法来判断一个方法是否是桥接方法,在字节码中桥接方法会被标记为ACC_BRIDGE和ACC_SYNTHETIC,其中ACC_BRIDGE用于说明这个方法是由编译生成的桥接方法,ACC_SYNTHETIC说明这个方法是由编译器生成,并且不会在源代码中出现。可以查看jvm规范中对这两个access_flag的解释http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.6

有如下3个问题:

 

  • 什么时候会生成桥接方法
  • 为什么要生成桥接方法
  • 如何通过桥接方法获取实际的方法

什么时候会生成桥接方法

那什么时候编译器会生成桥接方法呢?可以查看JLS中的描述http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.4.5

就是说一个子类在继承(或实现)一个父类(或接口)的泛型方法时,在子类中明确指定了泛型类型,那么在编译时编译器会自动生成桥接方法(当然还有其他情况会生成桥接方法,这里只是列举了其中一种情况)。如下所示:

桥接模式是一种设计模式,它用于将抽象部分与实现部分分离,使它们可以独立地变化。在Java中,桥接模式可以用于实现格式换。 下面是Java桥接模式实现格式换的基本步骤: 1. 定义抽象类(Abstraction):抽象类定义了抽象部分的接口,并包含一个对实现部分对象的引用。 2. 定义实现类接口(Implementor):实现类接口定义了实现部分的接口。 3. 创建具体实现类(ConcreteImplementor):具体实现类实现了实现类接口,并提供具体的实现逻辑。 4. 创建具体抽象类(ConcreteAbstraction):具体抽象类继承了抽象类,并实现了抽象部分的接口。 5. 在具体抽象类中调用实现部分的方法:在具体抽象类中,通过调用实现部分对象的方法来完成格式换。 下面是一个简单的Java桥接模式实现格式换的示例代码: ```java // 定义抽象类 abstract class FormatConverter { protected FormatImplementor implementor; public FormatConverter(FormatImplementor implementor) { this.implementor = implementor; } public abstract void convert(); } // 定义实现类接口 interface FormatImplementor { void convertFormat(); } // 创建具体实现类 class XMLFormatImplementor implements FormatImplementor { @Override public void convertFormat() { System.out.println("将数据换为XML格式"); } } class JSONFormatImplementor implements FormatImplementor { @Override public void convertFormat() { System.out.println("将数据换为JSON格式"); } } // 创建具体抽象类 class DataConverter extends FormatConverter { public DataConverter(FormatImplementor implementor) { super(implementor); } @Override public void convert() { implementor.convertFormat(); } } // 使用示例 public class Main { public static void main(String[] args) { FormatImplementor xmlImplementor = new XMLFormatImplementor(); FormatImplementor jsonImplementor = new JSONFormatImplementor(); FormatConverter xmlConverter = new DataConverter(xmlImplementor); xmlConverter.convert(); // 输出:将数据换为XML格式 FormatConverter jsonConverter = new DataConverter(jsonImplementor); jsonConverter.convert(); // 输出:将数据换为JSON格式 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值