java反射的补充:桥接方法以及Spring中一些工具类
在上一篇博文中: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中一些工具类的更多相关文章
- 简单了解Spring中常用工具类_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口, ...
- spring中常用工具类介绍
http://www.cnblogs.com/langtianya/p/3875103.html 文件资源操作 Spring 定义了一个 org.springframework.core.io ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- Java反射机制demo(六)—获得并操作一个类的属性
Java反射机制demo(六)—获得并操作一个类的属性 获得并操作一个类的属性?! 不可思议啊,一个类的属性一般都是私有成员变量啊,private修饰符啊! 但是毫无疑问,这些东西在Java的反射机制 ...
- Java反射机制demo(二)—通过Class实例化任意类的对象
Java反射机制demo(二)—通过Class实例化任意类的对象 上一章节中,实例化了Class类对象的实例,这个部分的demo展示了如何使用Class对象的实例去获得其他类的对象的实例. 任意一个类 ...
- Spring 的优秀工具类盘点
文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...
- Spring 的优秀工具类盘点第 2 部分
特殊字符转义 由于 Web 应用程序需要联合使用到多种语言,每种语言都包含一些特殊的字符,对于动态语言或标签式的语言而言,如果需要动态构造语言的内容时,一个我们经常会碰到的问题就是特殊字符转义的问题. ...
- Spring 的优秀工具类盘点---转
第 1 部分: 文件资源操作和 Web 相关工具类 http://www.ibm.com/developerworks/cn/java/j-lo-spring-utils1/ 文件资源操作 文件资源的 ...
- Spring获取bean工具类,可用于在线程里面获取bean
Spring获取bean工具类,可用于在线程里面获取bean import java.util.Locale; import org.springframework.beans.BeansExcept ...
随机推荐
- Python环境搭建之OpenGL
以下内容为我python OpenGl 环境搭建历程: win7 64位操作系统,python3.5.3 ,无其他相关. 直接cmd或PowerShell输入以下命令: pip install PyO ...
- Android中SharePreferences的简单实现
Android中提供SharePreferences这种轻量级的数据存储模式,这种模式能够存储少量数据,并能为自身和其他应用提供数据接口.相对于其他数据存储方式,SharePreferences更加轻 ...
- 「小程序JAVA实战」小程序视图之细说列表渲染(14)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-14/ 列表的渲染,不管是任何语言都有列表这个概念.源码:https://github.com/li ...
- Bootstrap 与 Jquery validate 结合使用——多个规则实现
进行开发的时候,遇到了需要有多个规则来校验,如新用户过来一套校验规则,老用户过来又是一套规则,这时候就要需要定义多套校验规则. 首先要熟悉Bootstrap和Jquery validate的使用,详情 ...
- spring jpa 创建时间和更新时间自动更新
@Entity @Table(name="RS_SIGNUPUSER") public class RsSignUpUser { @Id @GenericGenerator(nam ...
- Stencil
[Stencil] The stencil buffer can be used as a general purpose per pixel mask for saving or discardin ...
- VUE+WebPack实现精美前端游戏:CardBattle的游戏场景设置
C:\Users\ZHONGZHENHUA\cardBattle\src\App.vue src/App.vue <template> <div id="app" ...
- c# winform 解决PictureBox 无法打印全部图片的问题
一. 问题描述 在页面使用PictureBox 加载资料图片后,点击“打印”,只能打印图片首页,较大图片则无法全部打印. 二. 原因分析 PictureBox中打印图片时没有设置继续打印相关属 ...
- 刷题向》一道简单的思路题BZOJ1800(EASY+)
这道题其实并不难,主要原因是数据范围很小,当然数据如果大来也可以优化,但重点是在做的时候用的思路很通用, 所以本题是一道思想题(当然思想也不难) 标题里的“+”体现在一些边界处理中. 直接甩题目 De ...
- 关于java是值传递还是引用传递
一.概念 实际上对这两种传递方式,知乎上有个回答说得很好: 值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递 ...