Method.isBridge()

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

如下代码:

Java代码  

  1. public class TestBridgeMethod {
  2. public static void main(String[] args) {
  3. P p = new S();
  4. p.test(new Object());
  5. }
  6. }
  7. class P<T> {
  8. public T test (T t){
  9. return t;
  10. }
  11. }
  12. class S extends P<String> {
  13. @Override
  14. public String test(String t) {
  15. return t;
  16. }
  17. }

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

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

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

Java代码  

  1. import java.lang.reflect.Method;
  2. import java.util.Arrays;
  3. public class TestBridgeMethod {
  4. public static void main(String[] args) {
  5. Class<?> clazz = S.class;
  6. Method[] methods = clazz.getMethods();
  7. for(Method method : methods) {
  8. System.out.println(method.getName() + ":" + Arrays.toString(method.getParameterTypes()) + method.isBridge());
  9. }
  10. }
  11. }
  12. class P<T> {
  13. public T test (T t){
  14. return t;
  15. }
  16. }
  17. class S extends P<String> {
  18. @Override
  19. public String test(String t) {
  20. return t;
  21. }
  22. }

运行结果为:

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

时间: 2024-07-30 15:02:57

Method.isBridge()的相关文章

Java反射中method.isBridge() 桥接方法

桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法.我们可以通过Method.isBridge()方法来判断一个方法是否是桥接方法. 假定接口 public interface SuperClass<T> { void method(T t); } 它的一个实现类 public class AClass implements SuperClass<String> { @Override public

什么是Method.isBridge方法

参考:http://freish.iteye.com/blog/1158008 java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题. 如下代码: Java代码   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){ ret

java中什么是bridge method(桥接方法)

最近在看spring-mvc的源码,看到在解析handler方法的时候,有关于获取桥接方法代码,不明白什么是桥接方法,经过查找资料,终于理解了什么是桥接方法. 什么是桥接方法 桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法. 我们可以通过Method.isBridge()方法来判断一个方法是否是桥接方法,在字节码中桥接方法会被标记为ACC_BRIDGE和ACC_SYNTHETIC,其中ACC_BRIDGE用于说

Android:Otto源码分析

Otto源码分析 Otto是一个轻量级的EventBus,它的使用非常简单,我们使用一个Bus的单例,所有需要产生事件(@Produce bus.post(new YourEvent(-)))或者处理事件(@Subscribe)的对象,在create时register,销毁destroy时unregister即可. 使用 @Subscribe 订阅事件,也就是事件的处理者,它有且仅有一个参数YourEvent,每一个Subscribe对应处理一个YourEvent.Event用于连接(匹配)po

java class的兼容问题

前不久在工作中,遇到了几次编译class引起的NoSuchMethodError,经过分析与测试验证,也算是搞清楚了中间的来龙去脉,现在把一些结论性的东西(附带一些过程性的分析)分享出来. 在使用javac -source 1.6 -target 1.6来编译低版本的(这里为1.6)class时,记得要使用-bootclasspath参数来指定1.6版本的类库(一般是rt.jar),不指定的话,会产生一个警告:警告: [options] 未与 -source 1.6 一起设置引导类路径 警告:

你真的懂Java泛型吗

泛型实现参数化类型的概念,使代码可以应用于多种类型,解除类或方法与所使用的类型之间的约束.在JDK 1.5开始引入了泛型,但Java实现泛型的方式与C++或C#差异很大.在平常写代码用到泛型时,仿佛一切都来得如此理所当然.但其实Java泛型还是有挺多tricky的东西的,编译器在背后为我们做了很多事.下面我们来看看有关Java泛型容易忽视的点. 泛型不支持协变 什么是协变?举个例子. class Fruit{} class Apple extends Fruit{} Fruit[] fruit

Spring的反射工具类 ReflectionUtils

/* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://

java反射的补充:桥接方法以及Spring中一些工具类

在上一篇博文中:http://www.cnblogs.com/guangshan/p/4660564.html 源码中有些地方用到了 this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); 那么bridgedMethod是什么呢? 经查找发现,这个叫做桥接方法:http://freish.iteye.com/blog/1158008 java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题

Mybatis框架解析之Builder解析

首先我们从builder这个类入手,首先我们注意到BaseBuilder,其实它的本质上市一个抽象类,它从本质上抽象出了Builder的一切,我猜想这里一定使用了建造者模式,但是这个抽象类里面居然没有抽象方法! 其中XXXValueOf方法,其实是把String字符串转换成了相对应的类型,如下代码. protected Boolean booleanValueOf(String value, Boolean defaultValue) { return value == null ? defau