Java反射桥接方法解析

2019-10-17 09:08:26来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Java反射桥接方法解析

在阅读mybaits源码的反射模块时,看到了如下的一段代码:

/**
   * 添加 Method 数组到 uniqueMethods
   * @param uniqueMethods
   * @param methods
   */
  private void addUniqueMethods(Map<String, Method> uniqueMethods, Method[] methods) {
    for (Method currentMethod : methods) {
      //忽略 bridge 方法
      if (!currentMethod.isBridge()) {
        //获得方法签名
        String signature = getSignature(currentMethod);
        // check to see if the method is already known
        // if it is known, then an extended class must have
        // overridden a method
        //uniqueMethods 不包含此方法签名时,进行添加
        if (!uniqueMethods.containsKey(signature)) {
          //添加
          uniqueMethods.put(signature, currentMethod);
        }
      }
    }
  }

为了避免对没看过这段源码的朋友造成干扰,所以我对代码加了一些注释,这里点名感谢一下 芋道源码 大佬,艿艿这个狼人是真滴强,推荐大家关注,一起读源码,一起秃头。

回到正题,我比较疑惑的是 currentMethod.isBridge()isBridge 是干嘛的,那么打开看一下。

public boolean isBridge() {
    return (getModifiers() & Modifier.BRIDGE) != 0;
}

@Override
public int getModifiers() {
    return modifiers;
}

java.lang.reflect.Modifier#BRIDGE 的值是 0x00000040

知乎上一位大佬给出了一个详细答案, https://www.zhihu.com/question/54895701 ,就是说因为泛型的原因,所以编译器在编译过程中会对泛型方法自动生成不存在类型的方法。结合mybatis的这段源码来看,也就是在反射过程中,移除那些编译器生成的方法,因为反射是基于字节码操作的,所以这一步是必要的。

isBridge方法就是判断是否是桥接的方法,也就是编译器自己生成的,而非开发者自定义的方法。

以上是一些个人理解,如果偏差,还请指正,我及时更改,以免误导他人。


原文链接:https://www.cnblogs.com/ttlx/p/11690162.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:spring源码分析系列5:ApplicationContext的初始化与Bean生命周期

下一篇:Java集合总结—再也不怕面试问到集合了