Class ClassReloadingStrategy
- All Implemented Interfaces:
ClassLoadingStrategy<ClassLoader>
The class reloading strategy allows to redefine loaded Classes. Note that this strategy
will always attempt to load an existing class prior to its redefinition, even if this class is not yet loaded.
Note: In order to redefine any type, neither its name or its modifiers must be changed. Furthermore, no
fields or methods must be removed or added. This makes this strategy generally incompatible to applying it to a
rebased class definition as by ByteBuddy.rebase(Class) which copies the original method
implementations to additional methods. Furthermore, even the ByteBuddy.redefine(Class)
adds a method if the original class contains an explicit class initializer. For these reasons, it is not
recommended to use this ClassLoadingStrategy with arbitrary classes.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static interfaceA strategy to apply for injecting classes into the bootstrap class loader.protected static interfaceA dispatcher to interact with the instrumentation API.static enumA strategy which performs the actual redefinition of aClass.Nested classes/interfaces inherited from interface ClassLoadingStrategy
ClassLoadingStrategy.Configurable<S>, ClassLoadingStrategy.Default, ClassLoadingStrategy.ForBootstrapInjection, ClassLoadingStrategy.ForJnaInjection, ClassLoadingStrategy.ForUnsafeInjection, ClassLoadingStrategy.UsingLookup -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final ClassReloadingStrategy.BootstrapInjectionThe strategy to apply for injecting classes into the bootstrap class loader.protected static final ClassReloadingStrategy.DispatcherA dispatcher to use with some methods of theInstrumentationAPI.private final InstrumentationThis instance's instrumentation.The preregistered types of this instance.private final ClassReloadingStrategy.StrategyAn strategy which performs the actual redefinition of aClass.Fields inherited from interface ClassLoadingStrategy
BOOTSTRAP_LOADER, NO_PROTECTION_DOMAIN -
Constructor Summary
ConstructorsModifierConstructorDescriptionClassReloadingStrategy(Instrumentation instrumentation, ClassReloadingStrategy.Strategy strategy) Creates a class reloading strategy for the given instrumentation using an explicit transformation strategy which is represented by anClassReloadingStrategy.Strategy.protectedClassReloadingStrategy(Instrumentation instrumentation, ClassReloadingStrategy.Strategy strategy, ClassReloadingStrategy.BootstrapInjection bootstrapInjection, Map<String, Class<?>> preregisteredTypes) Creates a new class reloading strategy. -
Method Summary
Modifier and TypeMethodDescriptionprivate static <T> TdoPrivileged(PrivilegedAction<T> action) A proxy forjava.security.AccessController#doPrivilegedthat is activated if available.enableBootstrapInjection(File folder) Enables bootstrap injection for this class reloading strategy.static ClassReloadingStrategyObtains aClassReloadingStrategyfrom an installed Byte Buddy agent.static ClassReloadingStrategyObtains aClassReloadingStrategyfrom an installed Byte Buddy agent.Map<TypeDescription, Class<?>> load(ClassLoader classLoader, Map<TypeDescription, byte[]> types) Loads a given collection of classes given their binary representation.static ClassReloadingStrategyof(Instrumentation instrumentation) Creates a class reloading strategy for the given instrumentation.preregistered(Class<?>... type) Registers a type to be explicitly available without explicit lookup.Resets all classes to their original definition while using the first type's class loader as a class file locator.reset(ClassFileLocator classFileLocator, Class<?>... type) Resets all classes to their original definition.private static InstrumentationResolves the instrumentation provided bynet.bytebuddy.agent.Installer.
-
Field Details
-
DISPATCHER
A dispatcher to use with some methods of theInstrumentationAPI. -
instrumentation
This instance's instrumentation. -
strategy
An strategy which performs the actual redefinition of aClass. -
bootstrapInjection
The strategy to apply for injecting classes into the bootstrap class loader. -
preregisteredTypes
-
-
Constructor Details
-
ClassReloadingStrategy
public ClassReloadingStrategy(Instrumentation instrumentation, ClassReloadingStrategy.Strategy strategy) Creates a class reloading strategy for the given instrumentation using an explicit transformation strategy which is represented by anClassReloadingStrategy.Strategy. The given instrumentation must support the strategy's transformation type.- Parameters:
instrumentation- The instrumentation to be used by this reloading strategy.strategy- A strategy which performs the actual redefinition of aClass.
-
ClassReloadingStrategy
protected ClassReloadingStrategy(Instrumentation instrumentation, ClassReloadingStrategy.Strategy strategy, ClassReloadingStrategy.BootstrapInjection bootstrapInjection, Map<String, Class<?>> preregisteredTypes) Creates a new class reloading strategy.- Parameters:
instrumentation- The instrumentation to be used by this reloading strategy.strategy- An strategy which performs the actual redefinition of aClass.bootstrapInjection- The bootstrap class loader injection strategy to use.preregisteredTypes- The preregistered types of this instance.
-
-
Method Details
-
doPrivileged
A proxy forjava.security.AccessController#doPrivilegedthat is activated if available.- Type Parameters:
T- The type of the action's resolved value.- Parameters:
action- The action to execute from a privileged context.- Returns:
- The action's resolved value.
-
of
Creates a class reloading strategy for the given instrumentation. The given instrumentation must either supportInstrumentation.isRedefineClassesSupported()orInstrumentation.isRetransformClassesSupported(). If both modes are supported, classes will be transformed using a class retransformation.- Parameters:
instrumentation- The instrumentation to be used by this reloading strategy.- Returns:
- A suitable class reloading strategy.
-
resolveByteBuddyAgentInstrumentation
Resolves the instrumentation provided bynet.bytebuddy.agent.Installer.- Returns:
- The installed instrumentation instance.
-
fromInstalledAgent
Obtains a
ClassReloadingStrategyfrom an installed Byte Buddy agent. This agent must be installed either by adding thebyte-buddy-agent.jarwhen starting up the JVM by
or after the start up using the Attach API. A convenience installer for the OpenJDK is provided by thejava -javaagent:byte-buddy-agent.jar -jar app.jarByteBuddyAgentwithin thebyte-buddy-agentmodule. The strategy is determined by the agent's support for redefinition where are retransformation is preferred over a redefinition.- Returns:
- A class reloading strategy which uses the Byte Buddy agent's
Instrumentation.
-
fromInstalledAgent
Obtains a
ClassReloadingStrategyfrom an installed Byte Buddy agent. This agent must be installed either by adding thebyte-buddy-agent.jarwhen starting up the JVM by
or after the start up using the Attach API. A convenience installer for the OpenJDK is provided by thejava -javaagent:byte-buddy-agent.jar -jar app.jarByteBuddyAgentwithin thebyte-buddy-agentmodule.- Parameters:
strategy- The strategy to use.- Returns:
- A class reloading strategy which uses the Byte Buddy agent's
Instrumentation.
-
load
public Map<TypeDescription, Class<?>> load(@MaybeNull ClassLoader classLoader, Map<TypeDescription, byte[]> types) Loads a given collection of classes given their binary representation.- Specified by:
loadin interfaceClassLoadingStrategy<ClassLoader>- Parameters:
classLoader- The class loader to used for loading the classes.types- Byte array representations of the types to be loaded mapped by their descriptions, where an iteration order defines an order in which they are supposed to be loaded, if relevant.- Returns:
- A collection of the loaded classes which will be initialized in the iteration order of the returned collection.
-
reset
Resets all classes to their original definition while using the first type's class loader as a class file locator.- Parameters:
type- The types to reset.- Returns:
- This class reloading strategy.
- Throws:
IOException- If a class file locator causes an IO exception.
-
reset
public ClassReloadingStrategy reset(ClassFileLocator classFileLocator, Class<?>... type) throws IOException Resets all classes to their original definition.- Parameters:
classFileLocator- The class file locator to use.type- The types to reset.- Returns:
- This class reloading strategy.
- Throws:
IOException- If a class file locator causes an IO exception.
-
enableBootstrapInjection
Enables bootstrap injection for this class reloading strategy.- Parameters:
folder- The folder to save jar files in that are appended to the bootstrap class path.- Returns:
- A class reloading strategy with bootstrap injection enabled.
-
preregistered
Registers a type to be explicitly available without explicit lookup.- Parameters:
type- The loaded types that are explicitly available.- Returns:
- This class reloading strategy with the given types being explicitly available.
-