company_banner

Андрей Беляев про рефлексию в Java на встрече jug.msk.ru

    В прошедший четверг, 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 октября можно дешевле купить билеты.
    • +16
    • 2.3k
    • 6
    JUG Ru Group
    712.84
    Конференции для программистов и сочувствующих. 18+
    Share post

    Comments 6

      +1
      Только я один про рефлексию в статье ничего не увидел?
      +2
      a_belyaev, вот сколько можно все-таки повторять миф — «Reflection — нет AOT компиляции»?
      Reflection совершенно не противоречит AOT компиляции. Можете по этому поводу посмотреть мой доклад про «AOT компиляцию SpringBoot», где я эту тему разжевал как никогда ранее подробно. Все чему противоречит Reflection — это AOT-компиляции Java приложений в предположении закрытости мира — в присутствии reflection теоретически нельзя определить границы закрытого мира. И уменьшение рефлексии этой проблеме не очень помогает: пока рефлексия есть и используется, закрывать мир — небезопасно, а значит имеет мало смысла с практической точки зрения
        +1
        Привет, спасибо за комментарий, я смотрел вот это видео. Мне точно надо как-то все-таки правильнее и яснее выражаться. AOT компиляция и reflection не противоречат друг другу, но в случае их совместного использования все становится немного сложнее. Можно нормально скомпилировать приложение, которое использует reflection. Какие-то классы, которые используются через reflection, можно вывести автоматически, какие-то — явно вписать в конфигурационные файлы и скормить эти файлы компилятору (если мы говорим о GraalVM компиляторе), где-то — угадать, какая будет логика загрузки классов в рантайме после старта программы. Мое мнение — на сложных приложениях такой подход будет давать сбои, учитывая, сколько сторонних библиотек мы с собой обычно тащим явно и неявно, в которых может быть вообще что угодно. Простой пример: аккуратно собранный Spring Context, ничего лишнего, компилятор все отлично собирает. Но вот в случае запуска через
        java -jar
        все прекрасно работает, а в случае запуска native image работает не все. И это обозримый код. Конечно, это больше говорит о недостатках GraalVM, но, тем не менее, в связи с переездом Excelsior под крыло Huawei, этот компилятор остается чуть не единственным вариантом для тех, кто хочет работать с AOT в java.
          +3
          Проблема GraalVM native image — это closed world assumption, когда сразу предполагается, что в рантайме мы ничего нового грузить не будем, а что вообще в принципе будем, вычисляем через замыкание потока управления. Этому подходу очевидно мешает и reflection и динамическая загрузка — статически замкнуть в присутствии reflection — невозможно. У Excelsior JET то же был давно (15 лет назад) оптимизатор на основе предположения замкнутости мира. Практика показала, что подход совршенно нежизнеспобоный для Java — ваши примеры в этом коментарии это наглядно показывают, только это было известно еще 15-20 лет назад. Однако AOT может жить и не полагаясь на CWA, давая сравнимые результаты с CWA по стартапу и футпринту с одной стороны, а с другой полностью соответсвуя спецификации ( то есть и рефлексия и динамическая загрузка — просто работают без всяких конфигурационных файлов). Возвращаясь к вашей презентации — предлагаю переформулировать тезис — «Reflection — нет AOT компиляции», в „Reflection — нельзя замкнуть мир заранее (плохо работает GraalVM native image)“.
            +2
            Да, справедливо. Если буду делать читать этот доклад ещё раз, то так и переформулирую. И попутно вкручу соображения про CWA. Excelsior — это здорово, но теперь же не загрузишь же дистрибутив с официального сайта. Если только по знакомым и третьесторонним файлопомойкамхранилищам искать :-)

      Only users with full accounts can post comments. Log in, please.