Java synthetic method and bridge method confusion

2

As stated in this Java Tutorial a bridge method implies that it is also a synthetic method. The question is, is it possible that invocation of isSynthetic method returns true but isBridge method returns false for a Method object, i.e., if a method is synthetic does it imply that it is also a bridge method?

It's not exactly the same but the source code for isSynthetic and isBridge methods looks like below:

static final int SYNTHETIC = 0x00001000;
public boolean isSynthetic() {
    return (getModifiers() & SYNTHETIC) != 0;
}

static final int BRIDGE = 0x00000040;
public boolean isBridge() {
    return (getModifiers() & BRIDGE) != 0;
}

Why isBridge method body is not like return isSynthetic();?

java
reflection
java-synthetic-methods
asked on Stack Overflow Dec 4, 2017 by Root G

3 Answers

2

If you are simply looking for an example of such:

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

There will be entries like:

lambda$0 isSynth : true isBridge : false
lambda$1 isSynth : true isBridge : false
answered on Stack Overflow Dec 4, 2017 by Eugene
1

Bridge is synthetic but synthetic is not necessarily bridge. Example:

public class Test {

    public Test clone() {
        return null;
    }

bytecode outline:

  // access flags 0x1041
  public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 
   L0
...
answered on Stack Overflow Dec 4, 2017 by Evgeniy Dorofeev
0

is it possible that invocation of isSynthetic method returns true but isBridge method returns false for a Method object

Yes, it is possible.

For example, the method AbstractPipeline.lambda$spliterator$0() is synthetic but is it NOT bridge.

According to the JVM Spec:

  • The ACC_SYNTHETIC flag indicates that this method was generated by a compiler and does not appear in source code
  • The ACC_BRIDGE flag is used to indicate a bridge method generated by a compiler for the Java programming language.

So,

  • A bridge method is 100% sure it is synthetic
  • A synthetic method is not necessary bridge

More on bridge method

Based on this article the bridge method is generated by Java Compiler for type erasure purpose of Java Generics.

answered on Stack Overflow Oct 23, 2019 by Happy • edited Apr 6, 2020 by Happy

User contributions licensed under CC BY-SA 3.0