橋接方法是 JDK 1.5 引入泛型后,為了使Java的泛型方法生成的字節(jié)碼和 1.5 版本前的字節(jié)碼相兼容,由編譯器自動(dòng)生成的方法。我們可以通過(guò)Method.isBridge()方法來(lái)判斷一個(gè)方法是否是橋接方法。
假定接口
public interface SuperClass<T> { void method(T t); }
它的一個(gè)實(shí)現(xiàn)類(lèi)
public class AClass implements SuperClass<String> { @Override public void method(String s) {
System.out.println(s);
}
}
因?yàn)榉盒褪窃?.5引入的,為了向前兼容,所以會(huì)在編譯時(shí)去掉泛型(泛型擦除)。那么SuperClass接口中的method方法的參數(shù)在虛擬機(jī)中只能是Object。
它應(yīng)該是這個(gè)樣子:
public interface SuperClass { void method(Object t); }
而 AClass 實(shí)現(xiàn)了SuperClass 接口,但是它的實(shí)現(xiàn)方法卻是:
public void method(String s) { System.out.println(s); }
根本就沒(méi)有實(shí)現(xiàn) void method(Object t) 方法。 這怎么回事,其實(shí)虛擬機(jī)自動(dòng)實(shí)現(xiàn)了一個(gè)方法。
AClass在虛擬機(jī)中是這個(gè)樣子:
public class AClass implements SuperClass { public void method(String s) { System.out.println(s); } public void method(Object s) { this.method((String) s); } }
這個(gè)void method(Object s) 就是橋接方法。
我們用這個(gè)命令查看
javap -p AClass.class
顯示如下:
Compiled from "AClass.java" public class AClass implements SuperClass<java.lang.String> { public AClass(); public void method(java.lang.String); public void method(java.lang.Object); }
我們用反射寫(xiě)個(gè)測(cè)試,看結(jié)果如何
public static void main(String[] args) throws Exception { AClass obj = new AClass(); Method m = AClass.class.getMethod("method", String.class); m.invoke(obj, "XXXXXXXXXXXXXXXXXX"); System.out.println(m.isBridge()); m = AClass.class.getMethod("method", Object.class); m.invoke(obj, "##################"); System.out.println(m.isBridge()); }
測(cè)試結(jié)果如下
XXXXXXXXXXXXXXXXXX false ################## true
聯(lián)系客服