Синтетический метод Java и метод моста
Как указано в этом руководстве по Java, метод моста подразумевает, что он также является синтетическим методом. Вопрос в том, возможно ли, что вызов isSynthetic
метод возвращает истину, но isBridge
метод возвращает ложь для Method
объект, т. е. если метод является синтетическим, означает ли это, что он также является методом моста?
Это не совсем то же самое, но исходный код isSynthetic
а также isBridge
методы выглядят как ниже:
static final int SYNTHETIC = 0x00001000;
public boolean isSynthetic() {
return (getModifiers() & SYNTHETIC) != 0;
}
static final int BRIDGE = 0x00000040;
public boolean isBridge() {
return (getModifiers() & BRIDGE) != 0;
}
Зачем isBridge
тело метода не похоже return isSynthetic();
?
2 ответа
Если вы просто ищете пример такого:
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);
Будут записи типа:
lambda$0 isSynth : true isBridge : false
lambda$1 isSynth : true isBridge : false
Мост синтетический, но синтетический не обязательно бридж. Пример:
public class Test {
public Test clone() {
return null;
}
схема байт-кода:
// access flags 0x1041
public synthetic bridge clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException
L0
...
возможно ли, чтобы призыв
isSynthetic
метод возвращает истину, ноisBridge
метод возвращает false для объекта Method
Да, это возможно.
Например, метод AbstractPipeline.lambda$ spliterator $0() - этоsynthetic
но это НЕ bridge
.
Согласно спецификации JVM:
- В
ACC_SYNTHETIC
флаг указывает, что этот метод был сгенерирован компилятором и не отображается в исходном коде - В
ACC_BRIDGE
Флаг используется для обозначения метода моста, созданного компилятором для языка программирования Java.
Так,
- А
bridge
метод на 100% уверенsynthetic
- А
synthetic
метод не нуженbridge
Еще bridge
метод
На основании этой статьиbridge
генерируется компилятором Java для стирания типов в Java Generics.