public final class BytecodeGen
extends java.lang.Object
This class makes heavy use of Function
and BiFunction
types when interacting
with generated fast-classes and enhanced proxies. This is a deliberate design decision to avoid
using Guice-specific types in the generated classes. This means generated classes can be defined
in the same ClassLoader
as their host class without needing access to Guice's own ClassLoader
. (In other words it removes any need for bridge ClassLoader
s.)
Modifier and Type | Class and Description |
---|---|
static interface |
BytecodeGen.EnhancerBuilder
Builder of enhanced classes.
|
Modifier and Type | Field and Description |
---|---|
private static java.util.Map<java.lang.Class<?>,java.lang.Boolean> |
circularProxyTypeCache |
private static com.google.common.cache.LoadingCache<java.lang.Class<?>,BytecodeGen.EnhancerBuilder> |
ENHANCER_BUILDERS
Cache of recent
BytecodeGen.EnhancerBuilder s. |
static java.lang.String |
ENHANCER_BY_GUICE_MARKER |
private static java.lang.ClassValue<java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>>> |
FAST_CLASSES
Lazy association between classes and their generated fast-classes.
|
static java.lang.String |
FASTCLASS_BY_GUICE_MARKER |
Constructor and Description |
---|
BytecodeGen() |
Modifier and Type | Method and Description |
---|---|
(package private) static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> |
enhancedConstructor(java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>> enhancer,
java.lang.reflect.Constructor<?> constructor)
Returns an invoker that constructs an enhanced instance.
|
(package private) static BytecodeGen.EnhancerBuilder |
enhancerBuilder(java.lang.Class<?> hostClass)
Create a builder of enhancers for the given class.
|
private static java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>> |
fastClass(java.lang.reflect.Executable member)
Prepares the class declaring the given member for fast invocation using bytecode generation.
|
(package private) static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> |
fastConstructor(java.lang.reflect.Constructor<?> constructor)
Returns a fast invoker for the given constructor.
|
(package private) static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> |
fastMethod(java.lang.reflect.Method method)
Returns a fast invoker for the given method.
|
static boolean |
isCircularProxy(java.lang.Object object)
Returns true if the given object is a circular proxy.
|
(package private) static <T> T |
newCircularProxy(java.lang.Class<T> type,
java.lang.reflect.InvocationHandler handler)
Creates a new circular proxy for the given type.
|
(package private) static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> |
superMethod(java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>> enhancer,
java.lang.reflect.Method method)
Returns an invoker that calls the original unenhanced method.
|
private static final java.util.Map<java.lang.Class<?>,java.lang.Boolean> circularProxyTypeCache
public static final java.lang.String ENHANCER_BY_GUICE_MARKER
public static final java.lang.String FASTCLASS_BY_GUICE_MARKER
private static final com.google.common.cache.LoadingCache<java.lang.Class<?>,BytecodeGen.EnhancerBuilder> ENHANCER_BUILDERS
BytecodeGen.EnhancerBuilder
s.
Uses weak values so builders can be collected after they're done enhancing.
private static final java.lang.ClassValue<java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>>> FAST_CLASSES
public static boolean isCircularProxy(java.lang.Object object)
static <T> T newCircularProxy(java.lang.Class<T> type, java.lang.reflect.InvocationHandler handler)
static BytecodeGen.EnhancerBuilder enhancerBuilder(java.lang.Class<?> hostClass)
static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> enhancedConstructor(java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>> enhancer, java.lang.reflect.Constructor<?> constructor)
static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> superMethod(java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>> enhancer, java.lang.reflect.Method method)
static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> fastConstructor(java.lang.reflect.Constructor<?> constructor)
Returns null
if the constructor cannot be "fast-invoked" due to visibility issues.
static java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object> fastMethod(java.lang.reflect.Method method)
null
for static methods, and an array of arguments for the method.
Returns null
if the method cannot be "fast-invoked" due to visibility issues.
private static java.util.function.Function<java.lang.String,java.util.function.BiFunction<java.lang.Object,java.lang.Object[],java.lang.Object>> fastClass(java.lang.reflect.Executable member)