В прошедший четверг, 26 сентября 2019 года, в офисе компании КРОК на встрече московского сообщества Java-разработчиков jug.msk.ru выступил Андрей Беляев с докладом «Уменьшаем количество рефлексии в коде».



О докладчике


Андрей в настоящий момент работает developer advocate в компании Haulmont, принимая участие в разработке CUBA Platform. Представлял компанию на конференции Oracle Code One, в том числе в этом году.

Доклады Андрея и участие его в подкасте:

  • «20 лет Java: зрелая экосистема и постоянные инновации» (DataArt-2015: видео)
  • «Тролль гнёт CUBA», c Алексеем Стукаловым (JUG.ru-2018: видео)
  • «Уменьшаем количество рефлексии в коде» (Deep Refactoring-2019: видео)
  • Подкаст «Разбор полётов», выпуск 190

Ещё ссылки: GitHub, Twitter, Хабр.

О докладе


Андрей Когунь открывает встречу, напоминая о ближайших конференциях (самая-самая ближайшая — Joker 2019) и представляя докладчика встречи, другого Андрея.



Доклад был посвящён теме рефлексии (reflection) в языке программирования Java. Были рассмотрены особенности reflection-вызовов в JVM, альтернативы их использованию, применение механизма LambdaMetafactory, примеры кодогенерации. Были представлены микробенчмарки различных подходов, код находится на GitHub.



В докладе были упомянуты особенности двух веб-фреймворков — Micronaut и Quarkus. Quarkus является совсем молодым фреймворком от компании Red Hat. Вдохновившись его упоминанием, на следующий день добавил пример его использования в набор к остальным, написанным для недавней статьи.

В конце доклада были подведены итоги с оценкой различных подходов с точки зрения таких критериев, как поддерживаемость, скорость, возможность использования AOT, сложность реализации.



Традиционно для подобных встреч имелась возможность задать вопросы по теме доклада, пообщаться с коллегами в непринуждённой обстановке, подкрепив свои силы в перерыве булочками с чаем и кофе.



Презентация доклада: на Speaker Deck, видео скоро появится (см. ссылки ниже).

Ссылки по jug.msk.ru:

  • TimePad — анонсы встреч и регистрация на них, подписка на оповещение по почте о встречах
  • YouTube — видео докладов
  • Speaker Deck — презентации докладов
  • VK — анонсы встреч, фотоотчёты, ссылки на материалы прошедших встреч
  • Twitter: учётная запись (анонсы встреч, фотоотчётов, видео) и хэштег (твиты с комментариями о встречах)
  • Хабр — обзоры встреч, найти все обзоры можно по тегу

25-26 октября 2019 года в Санкт-Петербурге состоится конференция для Java-разработчиков Joker 2019, на которую в последние дни до 1 октября можно дешевле купить билеты.

Комментарии (6)


  1. PqDn
    30.09.2019 10:58
    +1

    Только я один про рефлексию в статье ничего не увидел?


    1. dbelob Автор
      30.09.2019 11:13

      Имеется возможность полистать презентацию, посмотреть видео предыдущего короткого варианта доклада (видео текущего появится здесь чуть позднее), посмотреть код и задать a_belyaev вопросы — думаю, Андрей на на них с удовольствием ответит.


  1. pjBooms
    01.10.2019 08:37
    +2

    a_belyaev, вот сколько можно все-таки повторять миф — «Reflection — нет AOT компиляции»?
    Reflection совершенно не противоречит AOT компиляции. Можете по этому поводу посмотреть мой доклад про «AOT компиляцию SpringBoot», где я эту тему разжевал как никогда ранее подробно. Все чему противоречит Reflection — это AOT-компиляции Java приложений в предположении закрытости мира — в присутствии reflection теоретически нельзя определить границы закрытого мира. И уменьшение рефлексии этой проблеме не очень помогает: пока рефлексия есть и используется, закрывать мир — небезопасно, а значит имеет мало смысла с практической точки зрения


    1. a_belyaev
      01.10.2019 10:40
      +1

      Привет, спасибо за комментарий, я смотрел вот это видео. Мне точно надо как-то все-таки правильнее и яснее выражаться. AOT компиляция и reflection не противоречат друг другу, но в случае их совместного использования все становится немного сложнее. Можно нормально скомпилировать приложение, которое использует reflection. Какие-то классы, которые используются через reflection, можно вывести автоматически, какие-то — явно вписать в конфигурационные файлы и скормить эти файлы компилятору (если мы говорим о GraalVM компиляторе), где-то — угадать, какая будет логика загрузки классов в рантайме после старта программы. Мое мнение — на сложных приложениях такой подход будет давать сбои, учитывая, сколько сторонних библиотек мы с собой обычно тащим явно и неявно, в которых может быть вообще что угодно. Простой пример: аккуратно собранный Spring Context, ничего лишнего, компилятор все отлично собирает. Но вот в случае запуска через

      java -jar
      все прекрасно работает, а в случае запуска native image работает не все. И это обозримый код. Конечно, это больше говорит о недостатках GraalVM, но, тем не менее, в связи с переездом Excelsior под крыло Huawei, этот компилятор остается чуть не единственным вариантом для тех, кто хочет работать с AOT в java.


      1. pjBooms
        01.10.2019 17:45
        +2

        Проблема GraalVM native image — это closed world assumption, когда сразу предполагается, что в рантайме мы ничего нового грузить не будем, а что вообще в принципе будем, вычисляем через замыкание потока управления. Этому подходу очевидно мешает и reflection и динамическая загрузка — статически замкнуть в присутствии reflection — невозможно. У Excelsior JET то же был давно (15 лет назад) оптимизатор на основе предположения замкнутости мира. Практика показала, что подход совршенно нежизнеспобоный для Java — ваши примеры в этом коментарии это наглядно показывают, только это было известно еще 15-20 лет назад. Однако AOT может жить и не полагаясь на CWA, давая сравнимые результаты с CWA по стартапу и футпринту с одной стороны, а с другой полностью соответсвуя спецификации ( то есть и рефлексия и динамическая загрузка — просто работают без всяких конфигурационных файлов). Возвращаясь к вашей презентации — предлагаю переформулировать тезис — «Reflection — нет AOT компиляции», в „Reflection — нельзя замкнуть мир заранее (плохо работает GraalVM native image)“.


        1. a_belyaev
          01.10.2019 18:10
          +2

          Да, справедливо. Если буду делать читать этот доклад ещё раз, то так и переформулирую. И попутно вкручу соображения про CWA. Excelsior — это здорово, но теперь же не загрузишь же дистрибутив с официального сайта. Если только по знакомым и третьесторонним файлопомойкамхранилищам искать :-)