APIdia Launch Partner
Top Description Methods
jdk.dynalink.linker

public Interface LinkerServices

Known Direct Implementers
jdk.dynalink.LinkerServicesImpl, jdk.dynalink.beans.LinkerServicesWithMissingMemberHandlerFactory
Imports
java.lang.invoke.MethodHandle, .MethodHandles, .MethodType, java.util.function.Supplier, jdk.dynalink.DynamicLinker, .DynamicLinkerFactory, .SecureLookupSupplier, jdk.dynalink.linker.ConversionComparator.Comparison, jdk.dynalink.linker.support.TypeUtilities

Interface for services provided to GuardingDynamicLinker instances by the DynamicLinker that owns them.
Since
9

Method Summary

Modifier and TypeMethod and Description
public MethodHandle
asType(MethodHandle
target method handle
handle
,
MethodType
the types of source arguments
fromType
)

Similar to MethodHandle#asType(MethodType) except it also hooks in method handles produced by all available GuardingTypeConverterFactory implementations, providing for language-specific type coercing of parameters.

public default MethodHandle

Returns:

a method handle that is a suitable combination of MethodHandle#asType(MethodType), and MethodHandles#filterArguments(MethodHandle, int, MethodHandle...) with GuardingTypeConverterFactory-produced type converters as filters.
asTypeLosslessReturn
(final MethodHandle
target method handle
handle
,
final MethodType
the types of source arguments
fromType
)

Similar to asType(MethodHandle, MethodType) except it treats return value type conversion specially.

public boolean

Returns:

true if there can be a conversion, false if there can not.
canConvert
(Class<?>
the source type for the conversion
from
,
Class<?>
the target type for the conversion
to
)

Returns true if there might exist a conversion between the requested types (either an automatic JVM conversion, or one provided by any available GuardingTypeConverterFactory), or false if there definitely does not exist a conversion between the requested types.

public ConversionComparator.Comparison

Returns:

one of Comparison constants that establish which – if any – of the target types is preferable for the conversion.
compareConversion
(Class<?>
the source type.
sourceType
,
Class<?>
one potential target type
targetType1
,
Class<?>
another potential target type.
targetType2
)

Determines which of the two type conversions from a source type to the two target types is preferred.

public MethodHandle

Returns:

a method handle with parameters and/or return type potentially filtered for wrapping and unwrapping.
filterInternalObjects
(final MethodHandle
the target method handle
target
)

Modifies the method handle so that any parameters that can receive potentially internal language runtime objects will have a filter added on them to prevent them from escaping, potentially by wrapping them.

public GuardedInvocation

Returns:

a guarded invocation linked by some of the guarding dynamic linkers managed by the top-level dynamic linker. Can be null if no available linker is able to link the invocation. You will typically use the elements of the returned invocation to compose your own invocation.
getGuardedInvocation
(LinkRequest
a request for linking the invocation
linkRequest
)

Creates a guarded invocation delegating back to the DynamicLinker that exposes this linker services object.

public MethodHandle

Returns:

a method handle performing the conversion.
getTypeConverter
(Class<?>
the type to convert from
sourceType
,
Class<?>
the type to convert to
targetType
)

Given a source and target type, returns a method handle that converts between them.

public <
the type of the return value provided by the passed-in supplier.
T
>
T

Returns:

the return value of the action
getWithLookup
(final Supplier<T>
the operation to execute in context of the specified lookup.
operation
,
final SecureLookupSupplier
secure supplier of the lookup
lookupSupplier
)

Executes an operation within the context of a particular MethodHandles.Lookup lookup object.

Method Detail

asTypeback to summary
public MethodHandle asType(MethodHandle handle, MethodType fromType)

Similar to MethodHandle#asType(MethodType) except it also hooks in method handles produced by all available GuardingTypeConverterFactory implementations, providing for language-specific type coercing of parameters. It will apply MethodHandle#asType(MethodType) for all primitive-to-primitive, wrapper-to-primitive, primitive-to-wrapper conversions as well as for all upcasts. For all other conversions, it'll insert MethodHandles#filterArguments(MethodHandle, int, MethodHandle...) with composite filters provided by GuardingTypeConverterFactory implementations.

Parameters
handle:MethodHandle

target method handle

fromType:MethodType

the types of source arguments

Returns:MethodHandle

a method handle that is a suitable combination of MethodHandle#asType(MethodType), MethodHandles#filterArguments(MethodHandle, int, MethodHandle...), and MethodHandles#filterReturnValue(MethodHandle, MethodHandle) with GuardingTypeConverterFactory-produced type converters as filters.

asTypeLosslessReturnback to summary
public default MethodHandle asTypeLosslessReturn(final MethodHandle handle, final MethodType fromType)

Similar to asType(MethodHandle, MethodType) except it treats return value type conversion specially. It only converts the return type of the method handle when it can be done using a conversion that loses neither precision nor magnitude, otherwise it leaves it unchanged. These are the only return value conversions that should be performed by individual language-specific linkers, and pre-link transformer of the dynamic linker should implement the strategy for dealing with potentially lossy return type conversions in a manner specific to the language runtime where the call site is located.

Parameters
handle:MethodHandle

target method handle

fromType:MethodType

the types of source arguments

Returns:MethodHandle

a method handle that is a suitable combination of MethodHandle#asType(MethodType), and MethodHandles#filterArguments(MethodHandle, int, MethodHandle...) with GuardingTypeConverterFactory-produced type converters as filters.

canConvertback to summary
public boolean canConvert(Class<?> from, Class<?> to)

Returns true if there might exist a conversion between the requested types (either an automatic JVM conversion, or one provided by any available GuardingTypeConverterFactory), or false if there definitely does not exist a conversion between the requested types. Note that returning true does not guarantee that the conversion will succeed at runtime for all values (especially if the "from" or "to" types are sufficiently generic), but returning false guarantees that it would fail.

Parameters
from:Class<?>

the source type for the conversion

to:Class<?>

the target type for the conversion

Returns:boolean

true if there can be a conversion, false if there can not.

compareConversionback to summary
public ConversionComparator.Comparison compareConversion(Class<?> sourceType, Class<?> targetType1, Class<?> targetType2)

Determines which of the two type conversions from a source type to the two target types is preferred. This is used for dynamic overloaded method resolution. If the source type is convertible to exactly one target type with a method invocation conversion, it is chosen, otherwise available ConversionComparators are consulted.

Parameters
sourceType:Class<?>

the source type.

targetType1:Class<?>

one potential target type

targetType2:Class<?>

another potential target type.

Returns:ConversionComparator.Comparison

one of Comparison constants that establish which – if any – of the target types is preferable for the conversion.

filterInternalObjectsback to summary
public MethodHandle filterInternalObjects(final MethodHandle target)

Modifies the method handle so that any parameters that can receive potentially internal language runtime objects will have a filter added on them to prevent them from escaping, potentially by wrapping them. It can also potentially add an unwrapping filter to the return value. Basically transforms the method handle using the transformer configured by DynamicLinkerFactory#setInternalObjectsFilter(MethodHandleTransformer).

Parameters
target:MethodHandle

the target method handle

Returns:MethodHandle

a method handle with parameters and/or return type potentially filtered for wrapping and unwrapping.

getGuardedInvocationback to summary
public GuardedInvocation getGuardedInvocation(LinkRequest linkRequest) throws Exception

Creates a guarded invocation delegating back to the DynamicLinker that exposes this linker services object. The dynamic linker will then itself delegate the linking to all of its managed GuardingDynamicLinkers including potentially this one if no linker responds earlier, so beware of infinite recursion. You'll typically craft the link request so that it will be different than the one you are currently trying to link.

Parameters
linkRequest:LinkRequest

a request for linking the invocation

Returns:GuardedInvocation

a guarded invocation linked by some of the guarding dynamic linkers managed by the top-level dynamic linker. Can be null if no available linker is able to link the invocation. You will typically use the elements of the returned invocation to compose your own invocation.

Exceptions
Exception:
in case the top-level linker throws an exception
getTypeConverterback to summary
public MethodHandle getTypeConverter(Class<?> sourceType, Class<?> targetType)

Given a source and target type, returns a method handle that converts between them. Never returns null; in worst case it will return an identity conversion (that might fail for some values at runtime). You rarely need to use this method directly and should mostly rely on asType(MethodHandle, MethodType) instead. This method is needed when you need to reuse existing type conversion machinery outside the context of processing a link request.

Parameters
sourceType:Class<?>

the type to convert from

targetType:Class<?>

the type to convert to

Returns:MethodHandle

a method handle performing the conversion.

getWithLookupback to summary
public <T> T getWithLookup(final Supplier<T> operation, final SecureLookupSupplier lookupSupplier)

Executes an operation within the context of a particular MethodHandles.Lookup lookup object. Normally, methods on LinkerServices are invoked as part of the linking mechanism in which case Dynalink internally maintains a per-thread current lookup (the one belonging to the descriptor of the call site being linked). This lookup can be retrieved by any GuardingTypeConverterFactory involved in linking if it needs to generate lookup-sensitive converters. However, linker services' methods can be invoked outside the linking process too when implementing invocation-time dispatch schemes, invoking conversions at runtime, etc. If it becomes necessary to use any type converter in this situation, and it needs a lookup, it will normally only get MethodHandles#publicLookup() as the thread is not engaged in a linking operation. If there is a way to meaningfully associate the operation to the context of some caller class, consider performing it within an invocation of this method and passing a full-strength lookup for that class, as it will associate that lookup with the current thread for the duration of the operation.

Parameters
<T>
the type of the return value provided by the passed-in supplier.
operation:Supplier<T>

the operation to execute in context of the specified lookup.

lookupSupplier:SecureLookupSupplier

secure supplier of the lookup

Returns:T

the return value of the action

Exceptions
NullPointerException:
if either action or lookupSupplier are null.
See Also
GuardingTypeConverterFactory#convertToType(Class, Class, Supplier)