О докладчике
Андрей в настоящий момент работает 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)
pjBooms
01.10.2019 08:37+2a_belyaev, вот сколько можно все-таки повторять миф — «Reflection — нет AOT компиляции»?
Reflection совершенно не противоречит AOT компиляции. Можете по этому поводу посмотреть мой доклад про «AOT компиляцию SpringBoot», где я эту тему разжевал как никогда ранее подробно. Все чему противоречит Reflection — это AOT-компиляции Java приложений в предположении закрытости мира — в присутствии reflection теоретически нельзя определить границы закрытого мира. И уменьшение рефлексии этой проблеме не очень помогает: пока рефлексия есть и используется, закрывать мир — небезопасно, а значит имеет мало смысла с практической точки зренияa_belyaev
01.10.2019 10:40+1Привет, спасибо за комментарий, я смотрел вот это видео. Мне точно надо как-то все-таки правильнее и яснее выражаться. AOT компиляция и reflection не противоречат друг другу, но в случае их совместного использования все становится немного сложнее. Можно нормально скомпилировать приложение, которое использует reflection. Какие-то классы, которые используются через reflection, можно вывести автоматически, какие-то — явно вписать в конфигурационные файлы и скормить эти файлы компилятору (если мы говорим о GraalVM компиляторе), где-то — угадать, какая будет логика загрузки классов в рантайме после старта программы. Мое мнение — на сложных приложениях такой подход будет давать сбои, учитывая, сколько сторонних библиотек мы с собой обычно тащим явно и неявно, в которых может быть вообще что угодно. Простой пример: аккуратно собранный Spring Context, ничего лишнего, компилятор все отлично собирает. Но вот в случае запуска через
все прекрасно работает, а в случае запуска native image работает не все. И это обозримый код. Конечно, это больше говорит о недостатках GraalVM, но, тем не менее, в связи с переездом Excelsior под крыло Huawei, этот компилятор остается чуть не единственным вариантом для тех, кто хочет работать с AOT в java.java -jar
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)“.
a_belyaev
01.10.2019 18:10+2Да, справедливо. Если буду делать читать этот доклад ещё раз, то так и переформулирую. И попутно вкручу соображения про CWA. Excelsior — это здорово, но теперь же не загрузишь же дистрибутив с официального сайта. Если только по знакомым и третьесторонним файло
помойкамхранилищам искать :-)
PqDn
Только я один про рефлексию в статье ничего не увидел?
dbelob Автор
Имеется возможность полистать презентацию, посмотреть видео предыдущего короткого варианта доклада (видео текущего появится здесь чуть позднее), посмотреть код и задать a_belyaev вопросы — думаю, Андрей на на них с удовольствием ответит.