Class BytecodeRecorderImpl
- java.lang.Object
-
- io.quarkus.deployment.recording.BytecodeRecorderImpl
-
- All Implemented Interfaces:
RecorderContext
public class BytecodeRecorderImpl extends Object implements RecorderContext
A class that can be used to record invocations to bytecode so they can be replayed later. This is done through the use of class recorders and recording proxies.A class recorder is simply a stateless class with a no arg constructor. This recorder will contain the runtime logic used to bootstrap the various frameworks.
A recording proxy is a proxy of a recorder that records all invocations on the recorder, and then writes out a sequence of java bytecode that performs the same invocations.
There are some limitations on what can be recorded. Only the following objects are allowed as parameters to recording proxies:
- primitives - String - Class - Objects returned from a previous recorder invocation - Objects with a no-arg constructor and getter/setters for all properties (or public fields) - Objects with a constructor annotated with @RecordableConstructor with parameter names that match field names - Any arbitrary object via the
registerSubstitution(Class, Class, Class)mechanism - arrays, lists and maps of the above
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static interfaceBytecodeRecorderImpl.BytecodeInstruction(package private) classBytecodeRecorderImpl.DeferredArrayStoreParameter(package private) classBytecodeRecorderImpl.DeferredParameterA bytecode serialized value.(package private) static classBytecodeRecorderImpl.FixedMethodContext(package private) static interfaceBytecodeRecorderImpl.InstructionGroupA group of instructions that will always be exectued in the same methodstatic interfaceBytecodeRecorderImpl.MethodContext(package private) static classBytecodeRecorderImpl.NewInstance(package private) static classBytecodeRecorderImpl.NonDefaultConstructorHolderstatic interfaceBytecodeRecorderImpl.ReturnedProxy(package private) static interfaceBytecodeRecorderImpl.SerialzationStepA step that must be executed to serialize a complex object(package private) static classBytecodeRecorderImpl.SplitMethodContextclass responsible for splitting the bytecode into smaller methods, to make sure that even large objects and large numbers of invocations do not put us over the method limit.(package private) static classBytecodeRecorderImpl.StoredMethodCall(package private) static classBytecodeRecorderImpl.SubstitutionHolder
-
Constructor Summary
Constructors Constructor Description BytecodeRecorderImpl(boolean staticInit, String buildStepName, String methodName, String uniqueHash)BytecodeRecorderImpl(ClassLoader classLoader, boolean staticInit, String className)BytecodeRecorderImpl(ClassLoader classLoader, boolean staticInit, String className, Function<io.quarkus.gizmo.ClassOutput,io.quarkus.gizmo.ClassCreator> classCreatorFunction, Function<io.quarkus.gizmo.ClassCreator,io.quarkus.gizmo.MethodCreator> methodCreatorFunction)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) static io.quarkus.gizmo.ResultHandlearrayValue(org.jboss.jandex.AnnotationValue value, io.quarkus.gizmo.BytecodeCreator valueMethod, org.jboss.jandex.MethodInfo method, org.jboss.jandex.ClassInfo annotationClass)Class<?>classProxy(String name)Creates a Class instance that can be passed to a recording proxy as a substitute for a class that is not loadable at processing time.(package private) static StringcomponentType(org.jboss.jandex.MethodInfo method)StringgetClassName()<T> TgetRecordingProxy(Class<T> theClass)booleanisEmpty()(package private) BytecodeRecorderImpl.DeferredParameterloadValue(org.jboss.jandex.AnnotationValue value, org.jboss.jandex.ClassInfo annotationClass, org.jboss.jandex.MethodInfo method)<T> RuntimeValue<T>newInstance(String name)Creates a RuntimeValue object that represents an object created via the default constructor.<T> voidregisterNonDefaultConstructor(Constructor<T> constructor, Function<T,List<Object>> parameters)Registers a way to construct an object via a non-default constructor.voidregisterObjectLoader(ObjectLoader loader)Register an object loader.<F,T>
voidregisterSubstitution(Class<F> from, Class<T> to, Class<? extends ObjectSubstitution<F,T>> substitution)Registers a substitution to allow objects that are not serialisable to bytecode to be substituted for an object that is.voidwriteBytecode(io.quarkus.gizmo.ClassOutput classOutput)
-
-
-
Constructor Detail
-
BytecodeRecorderImpl
public BytecodeRecorderImpl(boolean staticInit, String buildStepName, String methodName, String uniqueHash)
-
BytecodeRecorderImpl
BytecodeRecorderImpl(ClassLoader classLoader, boolean staticInit, String className)
-
BytecodeRecorderImpl
public BytecodeRecorderImpl(ClassLoader classLoader, boolean staticInit, String className, Function<io.quarkus.gizmo.ClassOutput,io.quarkus.gizmo.ClassCreator> classCreatorFunction, Function<io.quarkus.gizmo.ClassCreator,io.quarkus.gizmo.MethodCreator> methodCreatorFunction)
-
-
Method Detail
-
isEmpty
public boolean isEmpty()
-
registerSubstitution
public <F,T> void registerSubstitution(Class<F> from, Class<T> to, Class<? extends ObjectSubstitution<F,T>> substitution)
Description copied from interface:RecorderContextRegisters a substitution to allow objects that are not serialisable to bytecode to be substituted for an object that is.- Specified by:
registerSubstitutionin interfaceRecorderContext- Parameters:
from- The class of the non serializable objectto- The class to serialize tosubstitution- The subclass ofObjectSubstitutionthat performs the substitution
-
registerNonDefaultConstructor
public <T> void registerNonDefaultConstructor(Constructor<T> constructor, Function<T,List<Object>> parameters)
Description copied from interface:RecorderContextRegisters a way to construct an object via a non-default constructor. Each object may only have at most one non-default constructor registered- Specified by:
registerNonDefaultConstructorin interfaceRecorderContext- Type Parameters:
T- The type of the object- Parameters:
constructor- The constructorparameters- A function that maps the object to a list of constructor parameters
-
registerObjectLoader
public void registerObjectLoader(ObjectLoader loader)
Description copied from interface:RecorderContextRegister an object loader.- Specified by:
registerObjectLoaderin interfaceRecorderContext- Parameters:
loader- the object loader (must not benull)
-
classProxy
public Class<?> classProxy(String name)
Description copied from interface:RecorderContextCreates a Class instance that can be passed to a recording proxy as a substitute for a class that is not loadable at processing time. At runtime the actual class will be passed into the invoked method.- Specified by:
classProxyin interfaceRecorderContext- Parameters:
name- The class name- Returns:
- A Class instance that can be passed to a recording proxy
-
newInstance
public <T> RuntimeValue<T> newInstance(String name)
Description copied from interface:RecorderContextCreates a RuntimeValue object that represents an object created via the default constructor.This object can be passed into recorders, but must not be used directly at deployment time
- Specified by:
newInstancein interfaceRecorderContext- Type Parameters:
T- The type of the class- Parameters:
name- The name of the class- Returns:
- The class instance proxy
-
getRecordingProxy
public <T> T getRecordingProxy(Class<T> theClass)
-
getClassName
public String getClassName()
-
writeBytecode
public void writeBytecode(io.quarkus.gizmo.ClassOutput classOutput)
-
loadValue
BytecodeRecorderImpl.DeferredParameter loadValue(org.jboss.jandex.AnnotationValue value, org.jboss.jandex.ClassInfo annotationClass, org.jboss.jandex.MethodInfo method)
-
arrayValue
static io.quarkus.gizmo.ResultHandle arrayValue(org.jboss.jandex.AnnotationValue value, io.quarkus.gizmo.BytecodeCreator valueMethod, org.jboss.jandex.MethodInfo method, org.jboss.jandex.ClassInfo annotationClass)
-
componentType
static String componentType(org.jboss.jandex.MethodInfo method)
-
-