java.lang.invoke package contains dynamic language support provided directly by the Java core class libraries and virtual machine.See: Description
| Interface | Description |
|---|---|
| MethodHandleInfo | A symbolic reference obtained by cracking a direct method handle into its consitutent symbolic parts. |
| Class | Description |
|---|---|
| CallSite | |
| ConstantCallSite | A ConstantCallSite is aCallSite whose target is permanent, and can never be changed. |
| LambdaMetafactory | Methods to facilitate the creation of simple "function objects" that implement one or more interfaces by delegation to a provided MethodHandle, possibly after type adaptation and partial evaluation of arguments. |
| MethodHandle | A method handle is a typed, directly executable reference to an underlying method, constructor, field, or similar low-level operation, with optional transformations of arguments or return values. |
| MethodHandleProxies | This class consists exclusively of static methods that help adapt method handles to other JVM types, such as interfaces. |
| MethodHandles | This class consists exclusively of static methods that operate on or return method handles. |
| MethodHandles.Lookup | Alookup object is a factory for creating method handles, when the creation requires access checking. |
| MethodType | A method type represents the arguments and return type accepted and returned by a method handle, or the arguments and return type passed and expected by a method handle caller. |
| MutableCallSite | A MutableCallSite is aCallSite whose target variable behaves like an ordinary field. |
| SerializedLambda | Serialized form of a lambda expression. |
| SwitchPoint | A SwitchPoint is an object which can publish state transitions to other threads. |
| VolatileCallSite | A VolatileCallSite is aCallSite whose target acts like a volatile variable. |
| Exception | Description |
|---|---|
| LambdaConversionException | LambdaConversionException |
| WrongMethodTypeException | Thrown to indicate that code has attempted to call a method handle via the wrong method type. |
java.lang.invoke package contains dynamic language support provided directly by the Java core class libraries and virtual machine.As described in the Java Virtual Machine Specification, certain types in this package have special relations to dynamic language support in the virtual machine:
MethodHandle containssignature polymorphic methods which can be linked regardless of their type descriptor. Normally, method linkage requires exact matching of type descriptors.MethodHandle andMethodType.invokedynamic instruction is called adynamic call site.invokedynamic instructions Before the JVM can execute a dynamic call site (aninvokedynamic instruction), the call site must first belinked. Linking is accomplished by calling abootstrap method which is given the static information content of the call site, and which must produce amethod handle that gives the behavior of the call site.
Eachinvokedynamic instruction statically specifies its own bootstrap method as a constant pool reference. The constant pool reference also specifies the call site's name and type descriptor, just likeinvokevirtual and the other invoke instructions.
Linking starts with resolving the constant pool entry for the bootstrap method, and resolving aMethodType object for the type descriptor of the dynamic call site. This resolution process may trigger class loading. It may therefore throw an error if a class fails to load. This error becomes the abnormal termination of the dynamic call site execution. Linkage does not trigger class initialization.
The bootstrap method is invoked on at least three values:
MethodHandles.Lookup, a lookup object on thecaller class in which dynamic call site occursString, the method name mentioned in the call siteMethodType, the resolved type descriptor of the callMethodHandle.invoke. The returned result must be aCallSite (or a subclass). The type of the call site's target must be exactly equal to the type derived from the dynamic call site's type descriptor and passed to the bootstrap method. The call site then becomes permanently linked to the dynamic call site. As documented in the JVM specification, all failures arising from the linkage of a dynamic call site are reported by aBootstrapMethodError, which is thrown as the abnormal termination of the dynamic call site execution. If this happens, the same error will the thrown for all subsequent attempts to execute the dynamic call site.
If there are several such threads, the bootstrap method may be invoked in several threads concurrently. Therefore, bootstrap methods which access global application data must take the usual precautions against race conditions. In any case, everyinvokedynamic instruction is either unlinked or linked to a uniqueCallSite object.
In an application which requires dynamic call sites with individually mutable behaviors, their bootstrap methods should produce distinctCallSite objects, one for each linkage request. Alternatively, an application can link a singleCallSite object to severalinvokedynamic instructions, in which case a change to the target method will become visible at each of the instructions.
If several threads simultaneously execute a bootstrap method for a single dynamic call site, the JVM must choose oneCallSite object and install it visibly to all threads. Any other bootstrap method calls are allowed to complete, but their results are ignored, and their dynamic call site invocations proceed with the originally chosen target object.
Discussion: These rules do not enable the JVM to duplicate dynamic call sites, or to issue “causeless” bootstrap method calls. Every dynamic call site transitions at most once from unlinked to linked, just before its first invocation. There is no way to undo the effect of a completed bootstrap method call.
MethodHandle.invoke, its detailed type is arbitrary. For example, the first argument could beObject instead ofMethodHandles.Lookup, and the return type could also beObject instead ofCallSite. (Note that the types and number of the stacked arguments limit the legal kinds of bootstrap methods to appropriately typed static methods and constructors ofCallSite subclasses.) If a giveninvokedynamic instruction specifies no static arguments, the instruction's bootstrap method will be invoked on three arguments, conveying the instruction's caller class, name, and method type. If theinvokedynamic instruction specifies one or more static arguments, those values will be passed as additional arguments to the method handle. (Note that because there is a limit of 255 arguments to any method, at most 251 extra arguments can be supplied, since the bootstrap method handle itself and its first three arguments must also be stacked.) The bootstrap method will be invoked as if by eitherMethodHandle.invoke orinvokeWithArguments. (There is no way to tell the difference.)
The normal argument conversion rules forMethodHandle.invoke apply to all stacked arguments. For example, if a pushed value is a primitive type, it may be converted to a reference by boxing conversion. If the bootstrap method is a variable arity method (its modifier bit0x0080 is set), then some or all of the arguments specified here may be collected into a trailing array parameter. (This is not a special rule, but rather a useful consequence of the interaction betweenCONSTANT_MethodHandle constants, the modifier bit for variable arity methods, and theasVarargsCollector transformation.)
Given these rules, here are examples of legal bootstrap method declarations, given various numbersN of extra arguments. The first rows (marked*) will work for any number of extra arguments.
| N | sample bootstrap method |
|---|---|
| * | CallSite bootstrap(Lookup caller, String name, MethodType type, Object... args) |
| * | CallSite bootstrap(Object... args) |
| * | CallSite bootstrap(Object caller, Object... nameAndTypeWithArgs) |
| 0 | CallSite bootstrap(Lookup caller, String name, MethodType type) |
| 0 | CallSite bootstrap(Lookup caller, Object... nameAndType) |
| 1 | CallSite bootstrap(Lookup caller, String name, MethodType type, Object arg) |
| 2 | CallSite bootstrap(Lookup caller, String name, MethodType type, Object... args) |
| 2 | CallSite bootstrap(Lookup caller, String name, MethodType type, String... args) |
| 2 | CallSite bootstrap(Lookup caller, String name, MethodType type, String x, int y) |
CONSTANT_String andCONSTANT_Integer, respectively. The second-to-last example assumes that all extra arguments are of typeCONSTANT_String. The other examples work with all types of extra arguments. As noted above, the actual method type of the bootstrap method can vary. For example, the fourth argument could beMethodHandle, if that is the type of the corresponding constant in theCONSTANT_InvokeDynamic entry. In that case, theMethodHandle.invoke call will pass the extra method handle constant as anObject, but the type matching machinery ofMethodHandle.invoke will cast the reference back toMethodHandle before invoking the bootstrap method. (If a string constant were passed instead, by badly generated code, that cast would then fail, resulting in aBootstrapMethodError.)
Note that, as a consequence of the above rules, the bootstrap method may accept a primitive argument, if it can be represented by a constant pool entry. However, arguments of typeboolean,byte,short, orchar cannot be created for bootstrap methods, since such constants cannot be directly represented in the constant pool, and the invocation of the bootstrap method will not perform the necessary narrowing primitive conversions.
Extra bootstrap method arguments are intended to allow language implementors to safely and compactly encode metadata. In principle, the name and extra arguments are redundant, since each call site could be given its own unique bootstrap method. Such a practice is likely to produce large class files and constant pools.