@HashCodeAndEqualsPlugin.Enhance public static class AgentBuilder.DescriptionStrategy.SuperTypeLoading.Asynchronous extends Object implements AgentBuilder.DescriptionStrategy
A description strategy that enforces the loading of any super type of a type description but delegates the actual type description to another description strategy.
Note: This description strategy delegates class loading to another thread in order to enforce the instrumentation of any
unloaded super type. This requires the executor service to supply at least as many threads as the deepest type hierarchy within the
application minus one for the instrumented type as class loading blocks any thread until all of its super types are loaded. These
threads are typically short lived which predestines the use of a Executors.newCachedThreadPool()
without any upper bound
for the maximum number of created threads.
Important: This strategy can dead-lock under two circumstances:
ClassCircularityError
but
can result in dead-locks when using this instrumentation strategy.
For the above reasons, it is not recommended to use this strategy when the target class loader is unknown or if the target application might contain corrupt class files.
Modifier and Type | Class and Description |
---|---|
protected static class |
AgentBuilder.DescriptionStrategy.SuperTypeLoading.Asynchronous.ThreadSwitchingClassLoadingDelegate
A class loading delegate that delegates loading of the super type to another thread.
|
AgentBuilder.DescriptionStrategy.Default, AgentBuilder.DescriptionStrategy.SuperTypeLoading
Constructor and Description |
---|
Asynchronous(AgentBuilder.DescriptionStrategy delegate,
ExecutorService executorService)
Creates a new description strategy that enforces super type loading from another thread.
|
Modifier and Type | Method and Description |
---|---|
TypeDescription |
apply(String typeName,
Class<?> type,
TypePool typePool,
AgentBuilder.CircularityLock circularityLock,
ClassLoader classLoader,
JavaModule module)
Describes the given type.
|
boolean |
isLoadedFirst()
Indicates if this description strategy makes use of loaded type information and yields a different type description if no loaded type is available.
|
public Asynchronous(AgentBuilder.DescriptionStrategy delegate, ExecutorService executorService)
delegate
- The delegate description strategy.executorService
- The executor service to use for loading super types.public boolean isLoadedFirst()
isLoadedFirst
in interface AgentBuilder.DescriptionStrategy
true
if this description strategy prefers loaded type information when describing a type and only uses a type pool
if loaded type information is not available.public TypeDescription apply(String typeName, Class<?> type, TypePool typePool, AgentBuilder.CircularityLock circularityLock, ClassLoader classLoader, JavaModule module)
apply
in interface AgentBuilder.DescriptionStrategy
typeName
- The binary name of the type to describe.type
- The type that is being redefined, if a redefinition is applied or null
if no redefined type is available.typePool
- The type pool to use for locating a type if required.circularityLock
- The currently used circularity lock.classLoader
- The type's class loader where null
represents the bootstrap class loader.module
- The type's module or null
if the current VM does not support modules.Copyright © 2014–2020. All rights reserved.