转载

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/questio... ,就是说因为泛型的原因,所以编译器在编译过程中会对泛型方法自动生成不存在类型的方法。结合mybatis的这段源码来看,也就是在反射过程中,移除那些编译器生成的方法,因为反射是基于字节码操作的,所以这一步是必要的。

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

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

原文  https://segmentfault.com/a/1190000020715434
正文到此结束
Loading...