Что такое invokedynamic и как мне его использовать? - PullRequest
148 голосов
/ 10 июля 2011

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

Ответы [ 3 ]

155 голосов
/ 10 июля 2011

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

8 голосов
/ 10 июля 2011

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

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

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

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

InvokeDynamic duck = obj;
duck.quack(); 

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

2 голосов
/ 13 июля 2019

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

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

Статическая - проверка типов преформ во время компиляции (например, 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.

...