如类型擦除和桥接方法的效果中所述,桥接方法意味着它也是一种合成方法。问题是,是否有可能调用
isSynthetic
方法返回 true,但对于 isBridge
对象,Method
方法返回 false,即,如果方法是合成的,是否意味着它也是桥接方法?
并不完全相同,但
isSynthetic
和isBridge
方法的源代码如下所示:
static final int SYNTHETIC = 0x00001000;
public boolean isSynthetic() {
return (getModifiers() & SYNTHETIC) != 0;
}
static final int BRIDGE = 0x00000040;
public boolean isBridge() {
return (getModifiers() & BRIDGE) != 0;
}
为什么
isBridge
方法体不像return isSynthetic();
?
如果您只是寻找这样的示例:
Function<String, Integer> func = s -> s.length();
Arrays.stream(DeleteMe.class.getDeclaredMethods())
.peek(m -> System.out.println(m.getName() + " isSynth : " + m.isSynthetic() + " isBridge : " + m.isBridge()))
.forEach(System.out::println);
会有这样的条目:
lambda$0 isSynth : true isBridge : false
lambda$1 isSynth : true isBridge : false
桥是合成的,但合成不一定是桥。示例:
public class Test {
public Test clone() {
return null;
}
字节码概要:
// access flags 0x1041
public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException
L0
...
对于 Method 对象,调用
方法是否有可能返回 true,但isSynthetic
方法返回 falseisBridge
是的,这是可能的。
例如,方法 AbstractPipeline.lambda$spliterator$0() 是
synthetic
但它是 NOT bridge
.
根据 JVM 规范:
ACC_SYNTHETIC
标志表示该方法是由编译器生成的,不会出现在源代码中ACC_BRIDGE
标志用于指示编译器为Java编程语言生成的桥接方法。 那么,
bridge
方法 100% 确定是 synthetic
synthetic
方法bridge
bridge
方法基于本文,
bridge
方法由Java编译器生成,用于Java泛型的类型擦除目的。