final class UnsafeClassDefiner extends java.lang.Object implements ClassDefiner
ClassDefiner
that defines classes using sun.misc.Unsafe
.Modifier and Type | Class and Description |
---|---|
private static class |
UnsafeClassDefiner.ClassLoaderDefineClassHolder |
private static class |
UnsafeClassDefiner.DefineClassCacheHolder |
Modifier and Type | Field and Description |
---|---|
private static boolean |
ALWAYS_DEFINE_ANONYMOUSLY |
private static java.lang.String |
BYTE_ARRAY_TYPE |
private static java.lang.String |
CLASS_LOADER_TYPE |
private static java.lang.String[] |
DEFINEACCESS_API |
private static java.lang.String |
DEFINEACCESS_BY_GUICE_MARKER |
private static java.util.logging.Logger |
logger |
private static ClassDefiner |
UNSAFE_DEFINER |
Constructor and Description |
---|
UnsafeClassDefiner() |
Modifier and Type | Method and Description |
---|---|
(package private) static ClassDefiner |
accessDefineClass(java.lang.Class<?> loaderClass)
Generates helper in same package as the
ClassLoader so it can access defineClass |
private static byte[] |
buildDefineClassAccess(java.lang.Class<?> loaderClass)
ClassLoader helper that sits in the same package and passes on defineClass requests |
static boolean |
canDowncastToProxy(java.lang.Class<?> hostClass)
Returns true if it's possible to downcast to proxies defined from the given host.
|
static boolean |
canLoadProxyByName(java.lang.Class<?> hostClass)
Returns true if it's possible to load by name proxies defined from the given host.
|
java.lang.Class<?> |
define(java.lang.Class<?> hostClass,
byte[] bytecode)
Defines a new class relative to the host.
|
private static ClassDefiner |
findClassDefiner(java.lang.ClassLoader hostLoader)
Finds the appropriate class definer for the given class loader.
|
static boolean |
isAccessible()
Do we have access to
sun.misc.Unsafe ? |
(package private) static ClassDefiner |
tryAccessDefineClass(java.lang.Class<?> loaderClass) |
(package private) static <T> T |
tryPrivileged(java.security.PrivilegedExceptionAction<T> action,
java.lang.String errorMessage) |
private static final java.util.logging.Logger logger
private static final ClassDefiner UNSAFE_DEFINER
private static final boolean ALWAYS_DEFINE_ANONYMOUSLY
private static final java.lang.String DEFINEACCESS_BY_GUICE_MARKER
private static final java.lang.String[] DEFINEACCESS_API
private static final java.lang.String CLASS_LOADER_TYPE
private static final java.lang.String BYTE_ARRAY_TYPE
public static boolean isAccessible()
sun.misc.Unsafe
?public static boolean canLoadProxyByName(java.lang.Class<?> hostClass)
public static boolean canDowncastToProxy(java.lang.Class<?> hostClass)
public java.lang.Class<?> define(java.lang.Class<?> hostClass, byte[] bytecode) throws java.lang.Exception
ClassDefiner
define
in interface ClassDefiner
java.lang.Exception
private static ClassDefiner findClassDefiner(java.lang.ClassLoader hostLoader)
static <T> T tryPrivileged(java.security.PrivilegedExceptionAction<T> action, java.lang.String errorMessage)
static ClassDefiner tryAccessDefineClass(java.lang.Class<?> loaderClass)
static ClassDefiner accessDefineClass(java.lang.Class<?> loaderClass) throws java.lang.Exception
ClassLoader
so it can access defineClassjava.lang.Exception
private static byte[] buildDefineClassAccess(java.lang.Class<?> loaderClass)
ClassLoader
helper that sits in the same package and passes on defineClass requests