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();?
 Root G
 Root GIf 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
 Eugene
 EugeneBridge 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
...
is it possible that invocation of
isSyntheticmethod returns true butisBridgemethod 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:
ACC_SYNTHETIC flag indicates that this method was generated by a compiler and does not appear in source codeACC_BRIDGE flag is used to indicate a bridge method generated by a compiler for the Java programming language. So,
bridge method is 100% sure it is syntheticsynthetic method is not necessary bridgebridge methodBased on this article the bridge method is generated by Java Compiler for type erasure purpose of Java Generics.
User contributions licensed under CC BY-SA 3.0