Java中的Bridge方法(二)

2014-11-24 01:08:58 · 作者: · 浏览: 1
ss E {

}

class F extends E {

}

class X {
public E getE() {
return new E();
}
}

class Y extends X {
@Override
public F getE() {
return new F();
}
}

以上代码是可以编译通过的。让我们再来查看一下Y的字节码:

class org.levin.insidejvm.miscs.bridgemethod.Y extends org.levin.insidejvm.miscs.bridgemethod.X {

public org.levin.insidejvm.miscs.bridgemethod.F getE();

0 new org.levin.insidejvm.miscs.bridgemethod.F [16]

3 dup

4 invokespecial org.levin.insidejvm.miscs.bridgemethod.F() [18]

7 areturn

public bridge synthetic org.levin.insidejvm.miscs.bridgemethod.E getE();

0 aload_0 [this]

1 invokevirtual org.levin.insidejvm.miscs.bridgemethod.Y.getE() : org.levin.insidejvm.miscs.bridgemethod.F [20]

4 areturn

}

从字节码上,我们可以看出语法本身事实上并没有发生变化,变化的只是编译器做的支持,它为重载方法重新生成了一个返回E而不是F的bridge方法。

从调用的字节码上可以更加明显的看出语法没有发生变化这一点:


public static void main(String[] args) {
X x = new Y();
x.getE();
}

字节码如下:

public static void main(java.lang.String[] args);

0 new org.levin.insidejvm.miscs.bridgemethod.Y [16]

3 dup

4 invokespecial org.levin.insidejvm.miscs.bridgemethod.Y() [18]

7 astore_1 [x]

8 aload_1 [x]

9 invokevirtual org.levin.insidejvm.miscs.bridgemethod.X.getE() : org.levin.insidejvm.miscs.bridgemethod.E [19]

12 pop

13 return

该字节码中x.getE()方法事实上调用的就是生成的bridge方法(E getE())方法,而不是用户定义的F getE()方法。

这种重载机制在某些,不同子类某个函数的返回