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 ClassLoaders.)
| 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.EnhancerBuilders. |
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.EnhancerBuilders.
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)