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 ...
随机推荐
- SVN revert命令的使用
evert命令顾名思义就是对修改过的东西进行回滚操作.一般有2种情况发生时需要用到回滚的操作: 1,修改过的东西没有递交(commit) 这种情况下revert会取消之前的修改 用法:#svn rev ...
- http协议及web框架
http协议简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本 ...
- SpringBoot核心
1.基本配置 1.1入口类和@SrpingBootApplication SpringBoot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法就是一个标准的 ...
- “C# 未在本地计算机上注册microsoft.Jet.OLEDB.12.0”的解决方案
在进行Access数据库进行操作时,连接字符串为: OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLED ...
- asp.net 编码 解码
编码代码: System.Web.HttpUtility.HtmlEncode("<a href=\"http://hovertree.com/\">何问起& ...
- matching书页匹配例子
detect_brochure_pages.hdev *这个例子主要描述了从图片库中寻找有相应页面的那一页 *第一步中,不同的纸张页面用来做训练,最后创建好model *第二步,在未知的页面图片中 ...
- iOS开发基础控件--UILabel
UILabel 的常见属性和方法: //创建UIlabel对象 UILabel* label = [[UILabel alloc] initWithFrame:self.view.bounds]; / ...
- Py小技巧一:在列表,字典,集合中根据条件筛选数据
1.过滤掉列表中的某些项---列表解析 data=[1,4,2,8,5,-1] res=[] a.依次迭代列表中每一个项 for x in data: if >=0: res.append(x) ...
- MySQL数据库篇之单表查询
主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...
- systemd 配置文件
[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系.它的主要字段如下. Description:简短描述 Documentation:文档地址 ...