如此Java Tutorial中所述,桥接方法意味着它也是一种合成方法。问题是,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();
?
答案 0 :(得分:2)
如果您只是寻找一个这样的例子:
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
答案 1 :(得分:0)
桥是合成的,但合成不一定是桥梁。例如:
public class Test {
public Test clone() {
return null;
}
字节码大纲:
// access flags 0x1041
public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException
L0
...
答案 2 :(得分:0)
对于方法对象,
isSynthetic
方法的调用是否可能返回true,而isBridge
方法的调用将返回false
是的,有可能。
例如,方法AbstractPipeline。lambda$spliterator$0()是synthetic
,但它是否 bridge
。
根据JVM Spec:
ACC_SYNTHETIC
标志指示此方法是由编译器生成的,不会出现在源代码中ACC_BRIDGE
标志用于指示由编译器为Java编程语言生成的桥接方法。 所以
bridge
方法可以100%确保它是synthetic
synthetic
方法bridge
bridge
方法的更多信息基于this article的bridge
方法是Java编译器出于Java泛型的type erasure目的而生成的。