Search
Write a publication
Pull to refresh

Comments 3

Второе — для запуска приложения, написанного на фреймворке с AOT компиляцией, нужен специальный инструмент. Нельзя просто так взять и запустить приложение, написанное на Quarkus, например. Нужен специальный плагин для maven/gradle, который предварительно обработает ваш код.

Следует отметить, что есть два типа кодогенерации — compile time и execution time. Первый практически всегда использует стандартный механизм Java — annotation processing. Второй метод использует bytecode instrumentation при загрузке классов и библиотеки типа cglib, bytebuddy, etc. Именно второй метод обычно используется всеми фреймворками для ускорения работы.


Мне кажется, что без этого механизма Java не стала бы той Java, которая сейчас занимает большую долю рынка разработки прикладного программного обеспечения.

Reflection — это грязный хак, который изначально встроили только потому, что могли. Он сильно мешает оптимизациям в самой JVM, AOT, обфускации, а в коде используется в основном для интроспекции деклараций и проксирования. Без него везде использовалась бы кодогенерация и экосистема Java была бы более разумной и чистой.

Вот про reflection как грязный хак — даже не знаю. Такой философский вопрос, заслуживающий отдельного монументального труда. Эта возможность есть же не только в Java. Например, C# появился позже, а в нем есть Reflection. Не думаю, что это там оставили, только чтобы программистов с Java перетащить :-)
IBM и Hotspot JVM уже давно используют кодогенерацию для оптимизации рефлективного вызова. За это отвечает параметр sun.reflect.inflationThreshold (кол-во вызовов, по достижении которого jvm сгенерирует pure java аксессоры, по умолчанию, равен 15). Например, чтобы сразу использовать кодогенерацию можно запустить приложение с -Dsun.reflect.inflationThreshold =0 или -Dsun.reflect.noInflation, а чтобы отключить кодогенерацию, -Dsun.reflect.inflationThreshold=2147483647.
Sign up to leave a comment.