APIdia Launch Partner
Top Description Inners Fields Constructors Methods
jdk.dynalink

pack-priv final Class LinkerServicesImpl

extends Object
implements LinkerServices
Class Inheritance
All Implemented Interfaces
jdk.dynalink.linker.LinkerServices
Imports
java.lang.invoke.MethodHandle, .MethodHandles, .MethodHandles.Lookup, .MethodType, java.util.Objects, java.util.function.Supplier, jdk.dynalink.linker.ConversionComparator.Comparison, .GuardedInvocation, .GuardingDynamicLinker, .LinkRequest, .LinkerServices, .MethodHandleTransformer

Default implementation of the LinkerServices interface.

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
LinkerServicesImpl.LinkerException

Used to marshal a checked exception out of Supplier.get() in getGuardedInvocation.

Field Summary

Modifier and TypeField and Description
private final MethodHandleTransformer
private static final ThreadLocal<SecureLookupSupplier>
private final GuardingDynamicLinker
private final TypeConverterFactory

Constructor Summary

AccessConstructor and Description
pack-priv
LinkerServicesImpl(final TypeConverterFactory
the type converter factory exposed by the services.
typeConverterFactory
,
final GuardingDynamicLinker
the top level linker used by the services.
topLevelLinker
,
final MethodHandleTransformer
a method handle transformer that is supposed to act as the implementation of this services' filterInternalObjects(java.lang.invoke.MethodHandle) method.
internalObjectsFilter
)

Creates a new linker services object.

Method Summary

Modifier and TypeMethod and Description
public MethodHandle
asType(final MethodHandle handle, final MethodType fromType)

Implements jdk.dynalink.linker.LinkerServices.asType.

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 boolean
canConvert(final Class<?> from, final Class<?> to)

Implements jdk.dynalink.linker.LinkerServices.canConvert.

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
compareConversion(final Class<?> sourceType, final Class<?> targetType1, final Class<?> targetType2)

Implements jdk.dynalink.linker.LinkerServices.compareConversion.

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

public MethodHandle
filterInternalObjects(final MethodHandle target)

Implements jdk.dynalink.linker.LinkerServices.filterInternalObjects.

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.

pack-priv static MethodHandles.Lookup
public GuardedInvocation
getGuardedInvocation(final LinkRequest linkRequest)

Implements jdk.dynalink.linker.LinkerServices.getGuardedInvocation.

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

public MethodHandle
getTypeConverter(final Class<?> sourceType, final Class<?> targetType)

Implements jdk.dynalink.linker.LinkerServices.getTypeConverter.

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

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

Implements jdk.dynalink.linker.LinkerServices.getWithLookup.

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

private static <T> T
getWithLookupInternal(final Supplier<T> operation, final SecureLookupSupplier lookupSupplier)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

internalObjectsFilterback to summary
private final MethodHandleTransformer internalObjectsFilter
threadLookupSupplierback to summary
private static final ThreadLocal<SecureLookupSupplier> threadLookupSupplier
topLevelLinkerback to summary
private final GuardingDynamicLinker topLevelLinker
typeConverterFactoryback to summary
private final TypeConverterFactory typeConverterFactory

Constructor Detail

LinkerServicesImplback to summary
pack-priv LinkerServicesImpl(final TypeConverterFactory typeConverterFactory, final GuardingDynamicLinker topLevelLinker, final MethodHandleTransformer internalObjectsFilter)

Creates a new linker services object.

Parameters
typeConverterFactory:TypeConverterFactory

the type converter factory exposed by the services.

topLevelLinker:GuardingDynamicLinker

the top level linker used by the services.

internalObjectsFilter:MethodHandleTransformer

a method handle transformer that is supposed to act as the implementation of this services' filterInternalObjects(java.lang.invoke.MethodHandle) method.

Method Detail

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

Implements jdk.dynalink.linker.LinkerServices.asType.

Doc from jdk.dynalink.linker.LinkerServices.asType.

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.

Annotations
@Override
canConvertback to summary
public boolean canConvert(final Class<?> from, final Class<?> to)

Implements jdk.dynalink.linker.LinkerServices.canConvert.

Doc from jdk.dynalink.linker.LinkerServices.canConvert.

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.

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

Implements jdk.dynalink.linker.LinkerServices.compareConversion.

Doc from jdk.dynalink.linker.LinkerServices.compareConversion.

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.

Annotations
@Override
filterInternalObjectsback to summary
public MethodHandle filterInternalObjects(final MethodHandle target)

Implements jdk.dynalink.linker.LinkerServices.filterInternalObjects.

Doc from jdk.dynalink.linker.LinkerServices.filterInternalObjects.

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).

Annotations
@Override
getCurrentLookupback to summary
pack-priv static MethodHandles.Lookup getCurrentLookup()
getGuardedInvocationback to summary
public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest) throws Exception

Implements jdk.dynalink.linker.LinkerServices.getGuardedInvocation.

Doc from jdk.dynalink.linker.LinkerServices.getGuardedInvocation.

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.

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

Implements jdk.dynalink.linker.LinkerServices.getTypeConverter.

Doc from jdk.dynalink.linker.LinkerServices.getTypeConverter.

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.

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

Implements jdk.dynalink.linker.LinkerServices.getWithLookup.

Doc from jdk.dynalink.linker.LinkerServices.getWithLookup.

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.

Annotations
@Override
getWithLookupInternalback to summary
private static <T> T getWithLookupInternal(final Supplier<T> operation, final SecureLookupSupplier lookupSupplier)
jdk.dynalink back to summary

private Class LinkerServicesImpl.LinkerException

extends RuntimeException
Class Inheritance

Used to marshal a checked exception out of Supplier.get() in getGuardedInvocation.

Field Summary

Modifier and TypeField and Description
private static final long

Constructor Summary

AccessConstructor and Description
public

Field Detail

serialVersionUIDback to summary
private static final long serialVersionUID

Hides java.lang.RuntimeException.serialVersionUID.

Constructor Detail

LinkerExceptionback to summary
public LinkerException(final Exception cause)