Что invokedynamic и как его использовать?

Я все время слышу обо всех новых интересных функциях, которые добавляются в JVM, и одна из этих классных функций - invokedynamic. Я хотел бы знать, что это такое и как сделать рефлексивное программирование на Java проще или лучше?

Ответ 1

Это новая инструкция JVM, которая позволяет компилятору генерировать код, который вызывает методы с более низкой спецификацией, чем это было возможно ранее, - если вы знаете, что "утка набирает текст" is, invokedynamic в основном позволяет печатать на утке. Там не слишком много, как программист Java может с этим поделать; если вы создатель инструмента, вы можете использовать его для создания более гибких, более эффективных JVM-языков. Здесь - действительно сладкое сообщение в блоге, которое дает много деталей.

Ответ 2

Некоторое время назад С# добавила классную функцию, динамический синтаксис внутри С#

Object obj = ...; // no static type available 
dynamic duck = obj;
duck.quack(); // or any method. no compiler checking.

Подумайте об этом как о синтаксическом сахаре для вызовов рефлексивных методов. Он может иметь очень интересные приложения. см. http://www.infoq.com/presentations/Statically-Dynamic-Typing-Neal-Gafter

Нил Гафтер, ответственный за динамический тип С#, просто перешел от SUN к MS. Поэтому неразумно думать, что те же самые вещи обсуждались внутри SUN.

Я помню, вскоре после этого какой-то Java-чувак объявил что-то подобное

InvokeDynamic duck = obj;
duck.quack(); 

К сожалению, функции нет, где можно найти в Java 7. Очень разочарован. Для программистов на Java у них нет простого способа использовать invokedynamic в своих программах.

Ответ 3

Есть две концепции, которые нужно понять, прежде чем продолжать вызывать динамику.

1. Статическая и динамическая типизация

Static - проверка типов преформ во время компиляции (например, Java)

Динамический - проверка типов преформ во время выполнения (например, JavaScript)

Проверка типа - это процесс проверки того, что программа безопасна по типу, то есть проверка типизированной информации для переменных класса и экземпляра, параметров метода, возвращаемых значений и других переменных. Например, Java знает о int, String,.. во время компиляции, в то время как тип объекта в JavaScript может быть определен только во время выполнения

2. Сильный против слабого набора текста

Сильный - указывает ограничения на типы значений, предоставляемых его операциям (например, Java)

Слабые - преобразует (преобразует) аргументы операции, если эти аргументы имеют несовместимые типы (например, Visual Basic)

Зная, что Java является статически и слабо типизированным, как вы реализуете динамически и строго типизированные языки в JVM?

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

Пример: имея (a + b) и ничего не зная о переменных a, b во время компиляции, активизировал динамическую привязку этой операции к наиболее подходящему методу в Java во время выполнения. Например, если выясняется, что a, b - строки, вызовите метод (String a, String b). Если оказывается, что a, b являются целыми числами, то вызовите метод (int a, int b).

invokedynamic был представлен в Java 7.