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