在上一篇博文中:http://www.cnblogs.com/guangshan/p/4660564.html

源码中有些地方用到了

this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);

那么bridgedMethod是什么呢?

经查找发现,这个叫做桥接方法:http://freish.iteye.com/blog/1158008

java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题。

如下代码:

public class TestBridgeMethod {
public static void main(String[] args) {
P p = new S();
p.test(new Object());
}
} class P<T> {
public T test (T t){
return t;
}
} class S extends P<String> {
@Override
public String test(String t) {
return t;
}
}

p引用的是S的对象,但S的test方法返回值是String,在jdk1.4中没有泛型,就不会对p.test(new Object());进行检查,这样在调用的时候就会报ClassCastException

声明p的时候使用P<String> p就不会有这样的问题了。

为了兼容非泛型的代码,java编译器为test生成了两个方法。看下面的代码:

import java.lang.reflect.Method;
import java.util.Arrays; public class TestBridgeMethod {
public static void main(String[] args) {
Class<?> clazz = S.class;
Method[] methods = clazz.getMethods();
for(Method method : methods) {
System.out.println(method.getName() + ":" + Arrays.toString(method.getParameterTypes()) + method.isBridge());
}
}
} class P<T> {
public T test (T t){
return t;
}
} class S extends P<String> {
@Override
public String test(String t) {
return t;
}
}

运行结果为:

test:[class java.lang.String]false

test:[class java.lang.Object]true

getClass:[]false

hashCode:[]false

equals:[class java.lang.Object]false

toString:[]false

notify:[]false

notifyAll:[]false

wait:[long, int]false

wait:[]false

wait:[long]false

编译器为S生成了两个test方法,一个参数为String,用于泛型。一个参数为Object,用于非泛型,这个方法就是bridge方法,调用method.isBridge返回true。

之前提到的没有正确使用泛型时会导致越过类型检查,就是桥接方法引起的。

还有一些很有用的spring源码中的util工具集合:

http://www.cnblogs.com/younggun/p/3247262.html

java反射的补充:桥接方法以及Spring中一些工具类的更多相关文章

  1. 简单了解Spring中常用工具类_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口, ...

  2. spring中常用工具类介绍

    http://www.cnblogs.com/langtianya/p/3875103.html 文件资源操作     Spring 定义了一个 org.springframework.core.io ...

  3. Java反射机制demo(五)—获得并调用一个类中的方法

    Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...

  4. Java反射机制demo(六)—获得并操作一个类的属性

    Java反射机制demo(六)—获得并操作一个类的属性 获得并操作一个类的属性?! 不可思议啊,一个类的属性一般都是私有成员变量啊,private修饰符啊! 但是毫无疑问,这些东西在Java的反射机制 ...

  5. Java反射机制demo(二)—通过Class实例化任意类的对象

    Java反射机制demo(二)—通过Class实例化任意类的对象 上一章节中,实例化了Class类对象的实例,这个部分的demo展示了如何使用Class对象的实例去获得其他类的对象的实例. 任意一个类 ...

  6. Spring 的优秀工具类盘点

    文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...

  7. Spring 的优秀工具类盘点第 2 部分

    特殊字符转义 由于 Web 应用程序需要联合使用到多种语言,每种语言都包含一些特殊的字符,对于动态语言或标签式的语言而言,如果需要动态构造语言的内容时,一个我们经常会碰到的问题就是特殊字符转义的问题. ...

  8. Spring 的优秀工具类盘点---转

    第 1 部分: 文件资源操作和 Web 相关工具类 http://www.ibm.com/developerworks/cn/java/j-lo-spring-utils1/ 文件资源操作 文件资源的 ...

  9. Spring获取bean工具类,可用于在线程里面获取bean

    Spring获取bean工具类,可用于在线程里面获取bean import java.util.Locale; import org.springframework.beans.BeansExcept ...

随机推荐

  1. 跟我一起学kafka(二)

    kafka安装到linux服务器中的情况较多,但是我们现在在学习当中,所以可以拿windows先试试手.要想学kafk那么必然要做一件事就是安装好kafka,下面我讲详细得windows下安装kafk ...

  2. jssip音视频及短信开发demo(中文注释完整版)

    完整案例demo下载地址:http://download.csdn.net/download/qq_39421580/10214712 <!DOCTYPE html> <html l ...

  3. 搞点事情,使用node搭建反向代理

    导语 最近有个需求,需要对业务管理后台的操作记录进行上报.一般这种上报需求都是又后台同学来做比较合适的.但是因为后台人力的原因.这个工作落到了我这个小前端的头上.这里记录下做这个需求踩的一些坑. 一. ...

  4. 使用AdBlock plus屏蔽广告

    使用前 使用后 定制规则 使用前 添加规则 id=1的为广告

  5. Java设计模式之——抽象工厂

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  6. Scrum由来

    历史故事 在越南战争期间(1955年-1975年),对于美国战机飞行员而言,要执行100次飞行任务,飞到敌国领空被击落的概率是50%. 1967年,萨瑟兰还是一个没有经验的年轻飞行员,当时却是做最危险 ...

  7. delete属性

     

  8. Excel VBA入门(四)流程控制2-循环控制

    所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...

  9. emulator: Trying to vcpu execute at eip:6d4053

  10. 一张图5分钟熟悉MarkDown的基本语法

    看到zealer上面有介绍MarkDown的,以前在老罗的发布会也听说过,说锤子便签支持MarkDown,但是不知道有什么用,现在来看看,确实不错. MarkDown的好处是让你可以专注于写字本身,而 ...