public class Nexus
extends java.lang.ref.WeakReference<java.lang.ClassLoader>
This nexus is a global dispatcher for initializing classes with
LoadedTypeInitializer
s. To do so, this class is to be loaded
by the system class loader in an explicit manner. Any instrumented class is then injected a code
block into its static type initializer that makes a call to this very same nexus which had the
loaded type initializer registered before hand.
Note: Availability of the Nexus
class and its injection into the system class loader
can be disabled entirely by setting the PROPERTY
system property to false
.
Important: The nexus must never be accessed directly but only by the NexusAccessor
which makes sure that the nexus is loaded by the system class loader. Otherwise, a class might not
be able to initialize itself if it is loaded by different class loader that does not have the
system class loader in its hierarchy.
Modifier and Type | Field and Description |
---|---|
private int |
classLoaderHashCode
The class loader's hash code upon registration.
|
private int |
identification
A random value that uniquely identifies a Nexus entry in order to avoid conflicts when
applying the self-initialization strategy in multiple transformations.
|
private java.lang.String |
name
The name of a type for which a loaded type initializer is registered.
|
private static java.lang.ref.ReferenceQueue<java.lang.ClassLoader> |
NO_QUEUE
An type-safe constant for a non-operational reference queue.
|
static java.lang.String |
PROPERTY
A system property that allows to disable the use of the
Nexus class which is normally injected into the system class loader. |
private static java.util.concurrent.ConcurrentMap<Nexus,java.lang.Object> |
TYPE_INITIALIZERS
A map of keys identifying a loaded type by its name and class loader mapping their
potential
LoadedTypeInitializer where the class
loader of these initializers is however irrelevant. |
Modifier | Constructor and Description |
---|---|
private |
Nexus(java.lang.Class<?> type,
int identification)
Creates a key for identifying a loaded type initializer.
|
private |
Nexus(java.lang.String name,
java.lang.ClassLoader classLoader,
java.lang.ref.ReferenceQueue<? super java.lang.ClassLoader> referenceQueue,
int identification)
Creates a key for identifying a loaded type initializer.
|
Modifier and Type | Method and Description |
---|---|
static void |
clean(java.lang.ref.Reference<? super java.lang.ClassLoader> reference)
Cleans any stale entries from this nexus.
|
boolean |
equals(java.lang.Object other) |
int |
hashCode() |
static void |
initialize(java.lang.Class<?> type,
int identification)
Initializes a loaded type.
|
private static java.lang.String |
nonAnonymous(java.lang.String typeName)
Normalizes a type name if it is loaded by an anonymous class loader.
|
static void |
register(java.lang.String name,
java.lang.ClassLoader classLoader,
java.lang.ref.ReferenceQueue<? super java.lang.ClassLoader> referenceQueue,
int identification,
java.lang.Object typeInitializer)
Registers a new loaded type initializer.
|
java.lang.String |
toString() |
public static final java.lang.String PROPERTY
Nexus
class which is normally injected into the system class loader.private static final java.lang.ref.ReferenceQueue<java.lang.ClassLoader> NO_QUEUE
private static final java.util.concurrent.ConcurrentMap<Nexus,java.lang.Object> TYPE_INITIALIZERS
LoadedTypeInitializer
where the class
loader of these initializers is however irrelevant.private final java.lang.String name
private final int classLoaderHashCode
private final int identification
private Nexus(java.lang.Class<?> type, int identification)
type
- The loaded type for which a key is to be created.identification
- An identification for the initializer to run.private Nexus(java.lang.String name, java.lang.ClassLoader classLoader, java.lang.ref.ReferenceQueue<? super java.lang.ClassLoader> referenceQueue, int identification)
name
- The name of a type for which a loaded type initializer is registered.classLoader
- The class loader for which a loaded type initializer is registered.referenceQueue
- The reference queue to notify upon the class loader's collection or null
if no queue should be notified.identification
- An identification for the initializer to run.private static java.lang.String nonAnonymous(java.lang.String typeName)
typeName
- The name as returned by Class.getName()
.public static void initialize(java.lang.Class<?> type, int identification) throws java.lang.Exception
Initializes a loaded type. This method must only be invoked via the system class loader.
Important: This method must never be called directly but only by using a NexusAccessor.InitializationAppender
which enforces to
access this class for the system class loader to assure a VM global singleton. This avoids a duplication of the class if this nexus is loaded
by different class loaders. For this reason, the last parameter must not use a Byte Buddy specific type as those types can be loaded by
different class loaders, too. Any access of the instance is done using Java reflection instead.
type
- The loaded type to initialize.identification
- An identification for the initializer to run.java.lang.Exception
- If an exception occurs.public static void register(java.lang.String name, java.lang.ClassLoader classLoader, java.lang.ref.ReferenceQueue<? super java.lang.ClassLoader> referenceQueue, int identification, java.lang.Object typeInitializer)
Registers a new loaded type initializer.
Important: This method must never be called directly but only by using a NexusAccessor
which enforces to access this class
for the system class loader to assure a VM global singleton. This avoids a duplication of the class if this nexus is loaded by different class
loaders. For this reason, the last parameter must not use a Byte Buddy specific type as those types can be loaded by different class loaders,
too. Any access of the instance is done using Java reflection instead.
name
- The name of the type for the loaded type initializer.classLoader
- The class loader of the type for the loaded type initializer.referenceQueue
- The reference queue to notify upon the class loader's collection which will be enqueued a reference which can be
handed to clean(Reference)
or null
if no reference queue should be notified.identification
- An identification for the initializer to run.typeInitializer
- The type initializer to register. The initializer must be an instance
of LoadedTypeInitializer
where
it does however not matter which class loader loaded this latter type.public static void clean(java.lang.ref.Reference<? super java.lang.ClassLoader> reference)
Cleans any stale entries from this nexus. Entries are considered stale if their class loader was collected before a class was initialized.
Important: This method must never be called directly but only by using a NexusAccessor
which enforces to access this class
for the system class loader to assure a VM global singleton. This avoids a duplication of the class if this nexus is loaded by different class
loaders. For this reason, the last parameter must not use a Byte Buddy specific type as those types can be loaded by different class loaders,
too. Any access of the instance is done using Java reflection instead.
reference
- The stale reference to clean.public int hashCode()
hashCode
in class java.lang.Object
public boolean equals(java.lang.Object other)
equals
in class java.lang.Object
public java.lang.String toString()
toString
in class java.lang.Object