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();?
CodePudding user response:
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
CodePudding user response:
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
...
CodePudding user response:
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:
- The
ACC_SYNTHETICflag indicates that this method was generated by a compiler and does not appear in source code - The
ACC_BRIDGEflag is used to indicate a bridge method generated by a compiler for the Java programming language.
So,
- A
bridgemethod is 100% sure it issynthetic - A
syntheticmethod is not necessarybridge
More on bridge method
Based on this article the bridge method is generated by Java Compiler for type erasure purpose of Java Generics.
