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