org.elasticsearch.common.inject.internal
Class BytecodeGen
java.lang.Object
org.elasticsearch.common.inject.internal.BytecodeGen
public final class BytecodeGen
- extends java.lang.Object
Utility methods for runtime code generation and class loading. We use this stuff for faster reflection
, method
interceptors
and to proxy circular dependencies.
When loading classes, we need to be careful of:
- Memory leaks. Generated classes need to be garbage collected in long-lived
applications. Once an injector and any instances it created can be garbage collected, the
corresponding generated classes should be collectable.
- Visibility. Containers like
OSGi
use class loader boundaries
to enforce modularity at runtime.
For each generated class, there's multiple class loaders involved:
- The related class's class loader. Every generated class services exactly
one user-supplied class. This class loader must be used to access members with private and
package visibility.
- Guice's class loader.
- Our bridge class loader. This is a child of the user's class loader. It
selectively delegates to either the user's class loader (for user classes) or the Guice
class loader (for internal classes that are used by the generated classes). This class
loader that owns the classes generated by Guice.
Nested Class Summary |
static class |
BytecodeGen.Visibility
The required visibility of a user's class from a Guice-generated class. |
Method Summary |
static java.lang.ClassLoader |
getClassLoader(java.lang.Class<?> type)
Returns the class loader to host generated classes for type . |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
BytecodeGen
public BytecodeGen()
getClassLoader
public static java.lang.ClassLoader getClassLoader(java.lang.Class<?> type)
- Returns the class loader to host generated classes for
type
.