在阅读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方法就是判断是否是桥接的方法,也就是编译器自己生成的,而非开发者自定义的方法。

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

最新文章

  1. Android开源框架:NineOldAndroid
  2. ARM Linux 3.x的设备树(Device Tree)
  3. C# WebBrowser控件 模拟登录 抓取数据
  4. CentOS6.2编译安装codelite5.3
  5. [ZZ+CH] Html5 canvas+js 时钟
  6. ServiceStack.Redis
  7. windows版爬取csdn
  8. [黑马程序员] I/O
  9. 第二部分----CSS的基础语法
  10. L1-Day6
  11. Linux之命令初识
  12. sscanf、sprintf、stringstream常见用法
  13. [C]内存管理、内存泄露、堆栈
  14. Mongodb 笔记 - 性能及Java代码
  15. 随笔:JS对象无new构造原理
  16. laravel使用过程总结
  17. css固宽截取字符串
  18. 【sping揭秘】12、SpringAOP的实现机制
  19. HTTP 返回的状态码 != 200 ,浏览器不会将返回的内容缓存到本地磁盘上
  20. # Writing your first Django app, part 2

热门文章

  1. 事件类型(onchange)
  2. WinDbg 图形界面功能(四)
  3. mysql 通配符%以及_
  4. CSP-S乱搞记
  5. 刷题记录:[SUCTF 2019]EasySQL
  6. Android A/B System OTA分析(一)概览【转】
  7. 公网IP地址就一定是A类地址和B类地址吗?那C类地址就一定是私有地址吗?
  8. Android中Activity的启动模式(LaunchMode)和使用场景
  9. 阿里云服务器 nginx 公网 IP 无法访问 浏览器
  10. 将已经存在的项目提交到gitlab的新分支中