Java合成方法和桥接方法混淆

时间:2017-12-04 09:50:56

标签: java reflection java-synthetic-methods

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

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

3 个答案:

答案 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

是的,有可能。

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

根据JVM Spec

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

所以

  • 一种bridge方法可以100%确保它是synthetic
  • 不需要synthetic方法bridge

有关bridge方法的更多信息

基于this articlebridge方法是Java编译器出于Java泛型的type erasure目的而生成的。