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方法就是判断是否是桥接的方法,也就是编译器自己生成的,而非开发者自定义的方法。
以上是一些个人理解,如果偏差,还请指正,我及时更改,以免误导他人。

Java反射桥接方法解析的更多相关文章
- Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
- 深入解析Java反射-invoke方法
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...
- 解析Java反射 - invoke方法
最近工作中涉及到获取同程火车票,大概描述为:将本地获取的发出城市,目的城市及出发时间按固定格式封装,调用接口获取可乘坐座席等级最高的火车票,接口返回数据用包含三层类封装的类接受,接受的类总共为四层,倒 ...
- Java反射机制(Reflect)解析
一.导读 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计 ...
- 通过Java反射调用方法
这是个测试用的例子,通过反射调用对象的方法. TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...
- JAVA反射调用方法
1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotation.SetTable ...
- Java反射之方法反射demo
package reflect; import java.lang.reflect.Method; public class ClassDemo3 { public static void main( ...
- Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试
java中反射提供灵活性同时,给运行效率带来了一定影响.写个代码测试一下 package com.xzlf.reflectTest; import java.lang.reflect.Method; ...
- 3分钟快速搞懂Java的桥接方法
什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥 ...
随机推荐
- 目标检测的mAp
众多目标检测的知识中,都提到了mAp一值,那么这个东西到底是什么呢: 我们在评价一个目标检测算法的"好坏"程度的时候,往往采用的是pascal voc 2012的评价标准mAP.目 ...
- 事件类型(onfocus和onblur)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- UFUN函数 UF_ATTR函数(UF_ATTR_cycle )
UF_initialize(); tag_t ; ; int type=UF_ATTR_any ; ]=""; UF_ATTR_value_t value; //循环读取程序的属性 ...
- snmp-get
使用mibbroser可以连接到监控主机,可以获取主机mib信息 使用walk出的oid就可以获取到对应的值, 使用 -O fn 可以将返回的字符创形式的键改为数字型oid oid还有一种字符串的形式 ...
- zabbix显示 get value from agent failed:cannot connetct to xxxx:10050:[4] interrupted system call
在阿里云上部署的两台云主机,从server上 agent.ping不通agent10050端口,在agent上使用firewalld-cmd 添加了10050端口还不行,关闭了防火墙和selinux也 ...
- requestLayout() improperly called by xxxxxxxxxxxxxxxxxxx ScrollViewContainer 问题
当scrollview内的内容更改大小时,Scrollview不会自行调整大小.效果是,当内容变小时,内容将留在原来的位置,当内容变大时,无法看到.仅当ScrollView位于作为MasterDeta ...
- 【JZOJ6226】【20190618】纳什均衡
题目 一颗二叉树,每个点儿子个数为0 或 2 ,对每个叶子有一个权值\((c(u),d(u))\) 从根结点开始走,Alice 可以选择奇数层的走法,Bob 可以选择偶数层的走法,分别获得最后走到叶子 ...
- SpringBoot导入Excel数据到MySQL数据库
package com.example.example1.Controller; import com.example.example1.Entity.User; import com.example ...
- Web前端鼠标悬停实现显示与隐藏效果
css定义,偏移量,相对定位,绝对定位 显示与隐藏 二维码相对于微信图标定位 鼠标悬停微信图标上显示 鼠标离开微信图标时隐藏 什么是定位,就是定义网页标签在运行时显示的位置 css提供Position ...
- Java基础教程--安卓入门教程(七)
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 欢迎大家关注我的微信公众号:「醉翁猫咪」 什么是接口? 接口的基本语法 接口的基本语法(一) 使用interface定义 接口当中 ...