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

  • Field Details

  • Constructor Details

    • BytecodeRecorderImpl

      public BytecodeRecorderImpl(boolean staticInit, String buildStepName, String methodName, String uniqueHash, boolean useIdentityComparison)
    • BytecodeRecorderImpl

      public BytecodeRecorderImpl(boolean staticInit, String buildStepName, String methodName, String uniqueHash, boolean useIdentityComparison, Function<Type,Object> configCreatorFunction)
    • BytecodeRecorderImpl

      BytecodeRecorderImpl(ClassLoader classLoader, boolean staticInit, String className)
  • Method Details

    • isEmpty

      public boolean isEmpty()
    • registerSubstitution

      public <F, T> void registerSubstitution(Class<F> from, Class<T> to, Class<? extends ObjectSubstitution<? super F,? super T>> substitution)
      Description copied from interface: RecorderContext
      Registers a substitution to allow objects that are not serializable to bytecode to be substituted for an object that is.
      Specified by:
      registerSubstitution in interface RecorderContext
      Parameters:
      from - The class of the non-serializable object
      to - The class to serialize to
      substitution - The subclass of ObjectSubstitution that performs the substitution
    • registerNonDefaultConstructor

      public <T> void registerNonDefaultConstructor(Constructor<T> constructor, Function<T,List<Object>> parameters)
      Description copied from interface: RecorderContext
      Registers 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:
      registerNonDefaultConstructor in interface RecorderContext
      Type Parameters:
      T - The type of the object
      Parameters:
      constructor - The constructor
      parameters - A function that maps the object to a list of constructor parameters
    • registerObjectLoader

      public void registerObjectLoader(ObjectLoader loader)
      Description copied from interface: RecorderContext
      Register an object loader.
      Specified by:
      registerObjectLoader in interface RecorderContext
      Parameters:
      loader - the object loader (must not be null)
    • registerConstant

      public <T> void registerConstant(Class<T> type, T value)
    • classProxy

      public Class<?> classProxy(String name)
      Description copied from interface: RecorderContext
      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. At runtime the actual class will be passed into the invoked method.
      Specified by:
      classProxy in interface RecorderContext
      Parameters:
      name - The fully-qualified 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: RecorderContext
      Creates 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:
      newInstance in interface RecorderContext
      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)
    • markClassAsConstructorRecordable

      public void markClassAsConstructorRecordable(Class<?> clazz)
    • 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)