[#] Что там с JEP-303 или изобретаем invokedynamic
habrabot(difrex,1) — All
2017-05-10 16:00:04


Блогеры и авторы, пытающиеся быть на передовой, уже [немало][1] [писали][2] про проект Amber в Java 10. В этих статьях обязательно упоминается [вывод типов локальных переменных][3], улучшения [enum][4] и [лямбд][5], иногда пишут про pattern matching и data-классы. Но при этом незаслуженно обходится стороной [JEP 303][6]: Intrinsics for the LDC and INVOKEDYNAMIC Instructions. Возможно, потому что мало кто понимает, к чему это вообще. Хотя любопытно, что именно об этой фиче ребята из [NIX\_Solutions][7] фантазировали [на Хабре][8] год назад.



Широко известно, что в виртуальной машине Java, начиная с версии 7, есть интересная инструкция invokedynamic (она же indy). Про неё многие слышали, однако мало кто знает, что она делает на самом деле. Кто-то знает, что она используется при компиляции лямбда-выражений и ссылок на методы в Java 8. Некоторые слышали, что через неё реализована конкатенация строк в Java 9. Но хотя это полезные применения indy, изначальная цель всё же немного другая: делать динамический вызов, при котором вы можете вызывать разный код в одном и том же месте. Эта возможность не используется ни в лямбдах, ни в конкатенации строк: там поведение всегда генерируется при первом вызове и остаётся постоянным до конца работы программы (всегда используется [ConstantCallSite][9]). Давайте посмотрим, что можно сделать ещё.

[Читать дальше →][10]

[1]: https://www.javacodegeeks.com/2017/05/project-amber-future-java-exposed.html
[2]: https://www.sitepoint.com/project-amber-will-revolutionize-java/
[3]: http://openjdk.java.net/jeps/286
[4]: http://openjdk.java.net/jeps/301
[5]: http://openjdk.java.net/jeps/302
[6]: http://openjdk.java.net/jeps/303
[7]: https://habrahabr.ru/users/nix_solutions/
[8]: https://habrahabr.ru/company/nixsolutions/blog/281513/
[9]: https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/ConstantCallSite.html
[10]: https://habrahabr.ru/post/328240/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut