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

问题描述 投票:0回答:3

类型擦除和桥接方法的效果中所述,桥接方法意味着它也是一种合成方法。问题是,是否有可能调用

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();

java reflection java-synthetic-methods
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

1
投票

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

public class Test {

    public Test clone() {
        return null;
    }

字节码概要:

  // access flags 0x1041
  public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 
   L0
...

0
投票

对于 Method 对象,调用

isSynthetic
方法是否有可能返回 true,但
isBridge
方法返回 false

是的,这是可能的。

例如,方法 AbstractPipeline.lambda$spliterator$0()

synthetic
但它是 NOT
bridge
.

根据 JVM 规范

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

那么,

  • A
    bridge
    方法 100% 确定是
    synthetic
  • 不需要
    synthetic
    方法
    bridge

更多关于
bridge
方法

基于本文

bridge
方法由Java编译器生成,用于Java泛型的类型擦除目的。

© www.soinside.com 2019 - 2024. All rights reserved.