什么是Method.isBridge方法

参考:http://freish.iteye.com/blog/1158008

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:03:02

什么是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()

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){ return t; } } class S extends P<String&g

Factory Method 工厂方法模式

Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.” 创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中.创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分.工厂方法模式通

(转)Java.lang.reflect.Method invoke方法 实例

背景:今天在项目中用到Method 的invoke方法,但是并不理解,查完才知道,原来如此! import java.lang.reflect.Method; /** * Java.lang.reflect.Method invoke方法 实例 * 程序中配置文件中有对实体对象的get,set方法的描述,通过应用invoke()方法调用实体对象的method方法 return * m_oGetter.invoke(oSrc, null); oSrc为实体对象,Method m_oGetter *

java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】

转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T> annotationClass)方法如果存在这样的注释,则返回指定类型的元素的注释,否则为null. 声明 以下是java.lang.reflect.Method.getAnnotation(Class <T> annotationClass)方法的声明. public <T exte

c++ 设计模式8 (Factory Method 工厂方法)

5. "对象创建"类模式 通过"对象创建"类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: 在软件系统中,经常面临着创建对象的工作:由于需求的变化,需要创建的对象的具体类型经常变化. 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"具体对象创建工作"的紧耦合? 代码示例

【java】method.invoke(方法底层所属对象/null,new Object[]{实际参数})

反射调方法时无论是静态/非静态,固定/可变参数,都有Object对象数组对参数进行包装. 1 package com.tn.clas; 2 3 import java.lang.reflect.Method; 4 import java.util.Arrays; 5 6 public class Client { 7 public static void main(String[] args) throws Exception { 8 Class<User> clas=User.class;

Factory Method(工厂方法)-对象创建型模式

1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 2.动机 框架使用抽象类定义和维护对象之间的关系.这些对象的创建通常也由框架负责. 3.适用性 当一个类不知道它所必须创建的对象的类的时候. 当一个类希望由它的子类来指定它所创建的对象的时候. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一局部化的时候. 4.结构 5.代码实例 class Product { public: vir

(转)Monte Carlo method 蒙特卡洛方法

转载自:维基百科  蒙特卡洛方法 https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95 蒙特卡洛方法[编辑] 维基百科,自由的百科全书 蒙特卡洛方法(英语:Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法.是指使用随机数(或更常见的伪随机数)来解决很多