1.java桥接方法
import java.lang.reflect.Method;
import java.util.Arrays;
public class TestBridgeMethod {
public static class Warehouse<T>{
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
private T value;
}
public static class WarehouseInteger extends Warehouse<Integer>{
@Override
public void setValue(Integer value) {
super.setValue(value);
}
}
public static void main(String[] args) throws InterruptedException {
Method[] declaredMethods = WarehouseInteger.class.getDeclaredMethods();
Arrays.asList(declaredMethods).forEach((value)->{
System.out.println(value);
});
Thread.sleep(Integer.MAX_VALUE);
}
}
结果显示:
public void TestBridgeMethod$WarehouseInteger.setValue(java.lang.Integer)
public void TestBridgeMethod$WarehouseInteger.setValue(java.lang.Object)
使用javap -c 查看class文件:
Compiled from "TestBridgeMethod.java"
public class TestBridgeMethod$Warehouse<T> {
public TestBridgeMethod$Warehouse();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public T getValue();
Code:
0: aload_0
1: getfield #2 // Field value:Ljava/lang/Object;
4: areturn
public void setValue(T);
Code:
0: aload_0
1: aload_1
2: putfield #2 // Field value:Ljava/lang/Object;
5: return
}
Compiled from "TestBridgeMethod.java"
public class TestBridgeMethod$WarehouseInteger extends TestBridgeMethod$Warehouse<java.lang.Integer> {
public TestBridgeMethod$WarehouseInteger();
Code:
0: aload_0
1: invokespecial #1 // Method TestBridgeMethod$Warehouse."<init>":()V
4: return
public void setValue(java.lang.Integer);
Code:
0: aload_0
1: aload_1
2: invokespecial #2 // Method TestBridgeMethod$Warehouse.setValue:(Ljava/lang/Object;)V
5: return
public void setValue(java.lang.Object);
Code:
0: aload_0
1: aload_1
2: checkcast #3 // class java/lang/Integer
5: invokevirtual #4 // Method setValue:(Ljava/lang/Integer;)V
8: return
}
在TestBridgeMethod$WarehouseInteger类中setValue:(Ljava/lang/Object;)V中调用了本类的setValue:(Ljava/lang/Integer;)V,该方法为编译器帮我们生成的桥接方法
网友评论