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
isSynthetic
method returns true butisBridge
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 issynthetic
- A
synthetic
method 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.