Java合成法与桥接法混淆
Java synthetic method and bridge method confusion
如本Java Tutorial所述,桥接方法意味着它也是一种合成方法。问题是,是否有可能调用 isSynthetic
方法 returns true 但 isBridge
方法 returns false 对于 Method
对象,即,如果一个方法是synthetic是不是暗示它也是桥接方法?
这并不完全相同,但 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();
?
桥是合成的,但合成的不一定是桥。示例:
public class Test {
public Test clone() {
return null;
}
字节码大纲:
// access flags 0x1041
public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException
L0
...
如果您只是在寻找这样的例子:
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[=11=] isSynth : true isBridge : false
lambda isSynth : true isBridge : false
is it possible that invocation of isSynthetic
method returns true but isBridge
method returns false for a Method object
是的,这是可能的。
例如,方法 AbstractPipeline.lambda$spliterator[=23=]() 是 synthetic
但它是 NOT bridge
.
根据 JVM Spec:
ACC_SYNTHETIC
标志表示该方法是由编译器生成的,没有出现在源代码中
ACC_BRIDGE
标志用于指示编译器为 Java 编程语言生成的桥接方法。
所以,
- 一个
bridge
方法100%肯定是synthetic
- 不需要
synthetic
方法bridge
更多关于 bridge
方法
基于 this article the bridge
method is generated by Java Compiler for type erasure 泛型的 Java 目的。
如本Java Tutorial所述,桥接方法意味着它也是一种合成方法。问题是,是否有可能调用 isSynthetic
方法 returns true 但 isBridge
方法 returns false 对于 Method
对象,即,如果一个方法是synthetic是不是暗示它也是桥接方法?
这并不完全相同,但 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();
?
桥是合成的,但合成的不一定是桥。示例:
public class Test {
public Test clone() {
return null;
}
字节码大纲:
// access flags 0x1041
public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException
L0
...
如果您只是在寻找这样的例子:
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[=11=] isSynth : true isBridge : false
lambda isSynth : true isBridge : false
is it possible that invocation of
isSynthetic
method returns true butisBridge
method returns false for a Method object
是的,这是可能的。
例如,方法 AbstractPipeline.lambda$spliterator[=23=]() 是 synthetic
但它是 NOT bridge
.
根据 JVM Spec:
ACC_SYNTHETIC
标志表示该方法是由编译器生成的,没有出现在源代码中ACC_BRIDGE
标志用于指示编译器为 Java 编程语言生成的桥接方法。
所以,
- 一个
bridge
方法100%肯定是synthetic
- 不需要
synthetic
方法bridge
更多关于 bridge
方法
基于 this article the bridge
method is generated by Java Compiler for type erasure 泛型的 Java 目的。