2

如本Java 教程中所述,桥接方法意味着它也是一种合成方法。问题是,isSynthetic方法的调用是否有可能返回true,但isBridge对于一个对象,方法返回false Method,即,如果一个方法是合成的,是否意味着它也是一个桥接方法?

它并不完全相同,但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();

4

3 回答 3

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
于 2017-12-04T13:48:31.423 回答
1

桥接是合成的,但合成不一定是桥接。例子:

public class Test {

    public Test clone() {
        return null;
    }

字节码大纲:

  // access flags 0x1041
  public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 
   L0
...
于 2017-12-04T09:59:23.087 回答
0

方法的调用是否有可能isSynthetic返回 true 但isBridge方法对象的方法返回 false

对的,这是可能的。

例如,方法AbstractPipelinelambda$spliterator$0()synthetic不是 bridge

根据JVM 规范

  • ACC_SYNTHETIC标志表示此方法是由编译器生成的,并且没有出现在源代码中
  • ACC_BRIDGE标志用于指示编译器为 Java 编程语言生成的桥接方法。

所以,

  • 一种bridge方法是 100% 确定的synthetic
  • 方法synthetic不是必须的bridge

更多关于bridge方法

基于本文,该bridge方法由 Java Compiler 生成,用于Java 泛型的类型擦除。

于 2019-10-23T05:08:31.007 回答