Class CachedReturnPlugin

java.lang.Object
net.bytebuddy.build.Plugin.ForElementMatcher
net.bytebuddy.build.CachedReturnPlugin
All Implemented Interfaces:
Closeable, AutoCloseable, Plugin, Plugin.Factory, ElementMatcher<TypeDescription>

@Enhance public class CachedReturnPlugin extends Plugin.ForElementMatcher implements Plugin.Factory
A plugin that caches the return value of a method in a synthetic field. The caching mechanism is not thread-safe but can be used in a concurrent setup if the cached value is frozen, i.e. only defines final fields. In this context, it is possible that the method is executed multiple times by different threads but at the same time, this approach avoids a volatile field declaration. For methods with a primitive return type, the type's default value is used to indicate that a method was not yet invoked. For methods that return a reference type, null is used as an indicator. If a method returns such a value, this mechanism will not work. This plugin does not need to be closed.
  • Field Details

    • NAME_INFIX

      private static final String NAME_INFIX
      An infix between a field and the random suffix if no field name is chosen.
      See Also:
    • ADVICE_INFIX

      private static final String ADVICE_INFIX
      The infix symbol for advice classes.
      See Also:
    • ENHANCE_VALUE

      private static final MethodDescription.InDefinedShape ENHANCE_VALUE
      A description of the CachedReturnPlugin.Enhance.value() method.
    • ignoreExistingFields

      private final boolean ignoreExistingFields
      true if existing fields should be ignored if the field name was explicitly given.
    • randomString

      @ValueHandling(IGNORE) private final RandomString randomString
      A random string to use for avoid field name collisions.
    • classFileLocator

      private final ClassFileLocator classFileLocator
      The class file locator to use.
    • adviceByType

      A map of advice types mapped by their argument type. All advice types are precompiled using Java 6 to allow for releasing Byte Buddy with a Java 5 byte code level where compiled classes do not contain stack map frames. Byte Buddy filters stack map frames when applying advice in newer version but it cannot add stack map frames without explicit frame computation which is expensive which is why precompilation was used. To avoid loading Java classes in incompatible versions, all advice types are resolved using a type pool.
  • Constructor Details

    • CachedReturnPlugin

      public CachedReturnPlugin()
      Creates a plugin for caching method return values. If a field name exists before applying this plugin, an exception is raised.
    • CachedReturnPlugin

      public CachedReturnPlugin(boolean ignoreExistingFields)
      Creates a plugin for caching method return values.
      Parameters:
      ignoreExistingFields - true if existing fields should be ignored if the field name was explicitly given.
  • Method Details

    • make

      public Plugin make()
      Returns a plugin that can be used for a transformation and which is subsequently closed.
      Specified by:
      make in interface Plugin.Factory
      Returns:
      The plugin to use for type transformations.
    • apply

      public DynamicType.Builder<?> apply(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassFileLocator classFileLocator)
      Applies this plugin.
      Specified by:
      apply in interface Plugin
      Parameters:
      builder - The builder to use as a basis for the applied transformation.
      typeDescription - The type being transformed.
      classFileLocator - A class file locator that can locate other types in the scope of the project.
      Returns:
      The supplied builder with additional transformations registered.
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable