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

Java合成方法与桥接方法的混淆,java,reflection,java-synthetic-methods,Java,Reflection,Java Synthetic Methods,如本文所述,桥接方法意味着它也是一种合成方法。问题是,调用isSynthetic方法是否可能会为method对象返回true而isBridge方法是否会返回false,即,如果一个方法是合成的,是否意味着它也是桥接方法 这并不完全相同,但是isSynthetic和isBridge方法的源代码如下所示: 为什么isBridge方法体不像返回isSynthetic()?桥是合成的,但合成的不一定是桥。例如: public class Test { public Test clone() {

如本文所述,桥接方法意味着它也是一种合成方法。问题是,调用
isSynthetic
方法是否可能会为
method
对象返回true而
isBridge
方法是否会返回false,即,如果一个方法是合成的,是否意味着它也是桥接方法

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


为什么
isBridge
方法体不像
返回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);
调用
isSynthetic
方法是否可能为方法对象返回true,而
isBridge
方法返回false

是的,这是可能的

例如,方法。是合成的,但不是桥

根据报告:

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

  • bridge
    方法100%确定它是
    synthetic
  • 无需使用
    合成
    方法
    桥接
更多关于
bridge
方法的信息
基于
桥,
方法是由Java编译器为Java泛型生成的。

我通过在测试类上调用getDeclaredMethods()得到两个克隆方法。其中之一是合成和桥接。对象返回类型为的clone()是编译器创建的桥接方法,用于重写Object.clone()。编译器创建的所有隐式方法都是合成的,但它们是为不同的目的创建的。我知道什么是合成的,我只是想指出,您的答案需要澄清。你给出的方法不足以阐明你的结论。这些方法只是返回相应修饰符的值;该类可能只是一个数据持有者。关键是修饰符设置的逻辑。我也这么想。修饰符是通过构造函数设置的。但我找不到它的用法。相关问题供参考:另一个例子是当内部类访问外部类的
private
成员时生成的
access$n
方法,反之亦然。@Holger没有想到这些:)
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