Синтетический метод 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.

Другие вопросы по тегам