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();
?
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
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
...
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:
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 synthetic
synthetic
method is not necessary bridge
bridge
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