There are two concepts to understand before continuing to invokedynamic.

  1. Static vs. Dynamin Typing
    Static – preforms type checking at compile time (e.g. Java)
    Dynamic – preforms type checking at runtime (e.g. JavaScript)
    Type checking is a process of verifying that a program is type safe, this is, checking typed information for class and instance variables, method parameters, return values, and other variables.
    E.g. Java knows about int, String,.. at compile time, while type of an object in JavaScript can only be determined at runtime
  2. Strong vs. Weak typing
    Strong – specifies restrictions on the types of values supplied to its operations (e.g. Java)
    Weak – converts (casts) arguments of an operation if those arguments have incompatible types (e.g. Visual Basic)

Knowing that Java is a Statically and Weakly typed, how do you implement Dynamically and Strongly typed languages on the JVM?

The invokedynamic implements a runtime system that can choose the most appropriate implementation of a method or function — after the program has been compiled.

Example:
Having (a + b) and not knowing anything about the variables a,b at compile time, invokedynamic maps this operation to the most appropriate method in Java at runtime. E.g., if it turns out a,b are Strings, then call method(String a, String b). If it turns out a,b are ints, then call method(int a, int b).

invokedynamic was introduced with Java 7.

Last update 13.07.2019.
For possible mistakes in content or typos, I apologise and kindly ask you to report here.