Java合成法与桥接法混淆

Java synthetic method and bridge method confusion

如本Java Tutorial所述,桥接方法意味着它也是一种合成方法。问题是,是否有可能调用 isSynthetic 方法 returns true 但 isBridge 方法 returns false 对于 Method 对象,即,如果一个方法是synthetic是不是暗示它也是桥接方法?

这并不完全相同,但 isSyntheticisBridge 方法的源代码如下所示:

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 目的。