Class DynamicType.Default

    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private java.io.File doInject​(java.io.File sourceJar, java.io.File targetJar)
      Injects this dynamic type into a source jar and writes the result to the target jar.
      java.util.Map<TypeDescription,​byte[]> getAllTypes()
      Returns all types that are implied by this dynamic type.
      java.util.Map<TypeDescription,​byte[]> getAuxiliaryTypes()
      Returns a map of all auxiliary types that are required for making use of the main type.
      byte[] getBytes()
      Returns a byte array representing this dynamic type.
      java.util.Map<TypeDescription,​LoadedTypeInitializer> getLoadedTypeInitializers()
      Returns a map of all loaded type initializers for the main type and all auxiliary types, if any.
      TypeDescription getTypeDescription()
      Returns a description of this dynamic type.
      boolean hasAliveLoadedTypeInitializers()
      Checks if a dynamic type requires some form of explicit type initialization, either for itself or for one of its auxiliary types, if any.
      java.io.File inject​(java.io.File jar)
      Injects the types of this dynamic type into a given jar file.
      java.io.File inject​(java.io.File sourceJar, java.io.File targetJar)
      Injects the types of this dynamic type into a given jar file.
      java.util.Map<TypeDescription,​java.io.File> saveIn​(java.io.File folder)
      Saves a dynamic type in a given folder using the Java class file format while respecting the naming conventions for saving compiled Java classes.
      java.io.File toJar​(java.io.File file)
      Saves the contents of this dynamic type inside a jar file.
      java.io.File toJar​(java.io.File file, java.util.jar.Manifest manifest)
      Saves the contents of this dynamic type inside a jar file.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • CLASS_FILE_EXTENSION

        private static final java.lang.String CLASS_FILE_EXTENSION
        The file name extension for Java class files.
        See Also:
        Constant Field Values
      • MANIFEST_VERSION

        private static final java.lang.String MANIFEST_VERSION
        The default version of a jar file manifest.
        See Also:
        Constant Field Values
      • BUFFER_SIZE

        private static final int BUFFER_SIZE
        The size of a writing buffer.
        See Also:
        Constant Field Values
      • FROM_BEGINNING

        private static final int FROM_BEGINNING
        A convenience index for the beginning of an array to improve the readability of the code.
        See Also:
        Constant Field Values
      • END_OF_FILE

        private static final int END_OF_FILE
        A convenience representative of an InputStream's end to improve the readability of the code.
        See Also:
        Constant Field Values
      • TEMP_SUFFIX

        private static final java.lang.String TEMP_SUFFIX
        A suffix for temporary files.
        See Also:
        Constant Field Values
      • typeDescription

        protected final TypeDescription typeDescription
        A type description of this dynamic type.
      • binaryRepresentation

        protected final byte[] binaryRepresentation
        The byte array representing this dynamic type.
      • loadedTypeInitializer

        protected final LoadedTypeInitializer loadedTypeInitializer
        The loaded type initializer for this dynamic type.
      • auxiliaryTypes

        protected final java.util.List<? extends DynamicType> auxiliaryTypes
        A list of auxiliary types for this dynamic type.
    • Constructor Detail

      • Default

        public Default​(TypeDescription typeDescription,
                       byte[] binaryRepresentation,
                       LoadedTypeInitializer loadedTypeInitializer,
                       java.util.List<? extends DynamicType> auxiliaryTypes)
        Creates a new dynamic type.
        Parameters:
        typeDescription - A description of this dynamic type.
        binaryRepresentation - A byte array containing the binary representation of this dynamic type. The array must not be modified.
        loadedTypeInitializer - The loaded type initializer of this dynamic type.
        auxiliaryTypes - The auxiliary type required for this dynamic type.
    • Method Detail

      • getTypeDescription

        public TypeDescription getTypeDescription()

        Returns a description of this dynamic type.

        Note: This description will most likely differ from the binary representation of this type. Normally, annotations and intercepted methods are not added to this type description.

        Specified by:
        getTypeDescription in interface DynamicType
        Returns:
        A description of this dynamic type.
      • getAllTypes

        public java.util.Map<TypeDescription,​byte[]> getAllTypes()
        Returns all types that are implied by this dynamic type.
        Specified by:
        getAllTypes in interface DynamicType
        Returns:
        A mapping from all type descriptions, the actual type and its auxiliary types to their binary representation
      • getLoadedTypeInitializers

        public java.util.Map<TypeDescription,​LoadedTypeInitializer> getLoadedTypeInitializers()

        Returns a map of all loaded type initializers for the main type and all auxiliary types, if any.

        Note: The type descriptions will most likely differ from the binary representation of this type. Normally, annotations and intercepted methods are not added to the type descriptions of auxiliary types.

        Specified by:
        getLoadedTypeInitializers in interface DynamicType
        Returns:
        A mapping of all types' descriptions to their loaded type initializers.
      • hasAliveLoadedTypeInitializers

        public boolean hasAliveLoadedTypeInitializers()
        Checks if a dynamic type requires some form of explicit type initialization, either for itself or for one of its auxiliary types, if any. This is the case when this dynamic type was defined to delegate method calls to a specific instance which is stored in a field of the created type. If this class serialized, it could not be used without its loaded type initializers since the field value represents a specific runtime context.
        Specified by:
        hasAliveLoadedTypeInitializers in interface DynamicType
        Returns:
        true if this type requires explicit type initialization.
      • getBytes

        public byte[] getBytes()
        Returns a byte array representing this dynamic type. This byte array might be reused by this dynamic type and must therefore not be altered.
        Specified by:
        getBytes in interface DynamicType
        Returns:
        A byte array of the type's binary representation.
      • getAuxiliaryTypes

        public java.util.Map<TypeDescription,​byte[]> getAuxiliaryTypes()

        Returns a map of all auxiliary types that are required for making use of the main type.

        Note: The type descriptions will most likely differ from the binary representation of this type. Normally, annotations and intercepted methods are not added to the type descriptions of auxiliary types.

        Specified by:
        getAuxiliaryTypes in interface DynamicType
        Returns:
        A map of all auxiliary types by their descriptions to their binary representation.
      • saveIn

        public java.util.Map<TypeDescription,​java.io.File> saveIn​(java.io.File folder)
                                                                 throws java.io.IOException

        Saves a dynamic type in a given folder using the Java class file format while respecting the naming conventions for saving compiled Java classes. All auxiliary types, if any, are saved in the same directory. The resulting folder structure will resemble the structure that is required for Java run times, i.e. each folder representing a segment of the package name. If the specified folder does not yet exist, it is created during the call of this method.

        Note: The type descriptions will most likely differ from the binary representation of this type. Normally, annotations and intercepted methods are not added to the type descriptions of auxiliary types.

        Specified by:
        saveIn in interface DynamicType
        Parameters:
        folder - The base target folder for storing this dynamic type and its auxiliary types, if any.
        Returns:
        A map of type descriptions pointing to files with their stored binary representations within folder.
        Throws:
        java.io.IOException - Thrown if the underlying file operations cause an IOException.
      • inject

        public java.io.File inject​(java.io.File sourceJar,
                                   java.io.File targetJar)
                            throws java.io.IOException
        Injects the types of this dynamic type into a given jar file. Any pre-existent type with the same name is overridden during injection. The resulting jar is going to be a recreation of the original jar and not a patched version with a new central directory. No directory entries are added to the generated jar.
        Specified by:
        inject in interface DynamicType
        Parameters:
        sourceJar - The original jar file.
        targetJar - The source jar file with the injected contents.
        Returns:
        The target jar file.
        Throws:
        java.io.IOException - If an I/O exception occurs while injecting from the source into the target.
      • inject

        public java.io.File inject​(java.io.File jar)
                            throws java.io.IOException
        Injects the types of this dynamic type into a given jar file. Any pre-existent type with the same name is overridden during injection. The resulting jar is going to be a recreation of the original jar and not a patched version with a new central directory. No directory entries are added to the generated jar.
        Specified by:
        inject in interface DynamicType
        Parameters:
        jar - The jar file to replace with an injected version.
        Returns:
        The jar file.
        Throws:
        java.io.IOException - If an I/O exception occurs while injecting into the jar.
      • doInject

        private java.io.File doInject​(java.io.File sourceJar,
                                      java.io.File targetJar)
                               throws java.io.IOException
        Injects this dynamic type into a source jar and writes the result to the target jar.
        Parameters:
        sourceJar - The source jar.
        targetJar - The target jar.
        Returns:
        The jar file that was written to.
        Throws:
        java.io.IOException - If an I/O error occurs.
      • toJar

        public java.io.File toJar​(java.io.File file)
                           throws java.io.IOException
        Saves the contents of this dynamic type inside a jar file. The folder of the given file must exist prior to calling this method. The jar file is created with a simple manifest that only contains a version number. No directory entries are added to the generated jar.
        Specified by:
        toJar in interface DynamicType
        Parameters:
        file - The target file to which the jar is written to.
        Returns:
        The given file.
        Throws:
        java.io.IOException - If an I/O exception occurs while writing the file.
      • toJar

        public java.io.File toJar​(java.io.File file,
                                  java.util.jar.Manifest manifest)
                           throws java.io.IOException
        Saves the contents of this dynamic type inside a jar file. The folder of the given file must exist prior to calling this method. No directory entries are added to the generated jar.
        Specified by:
        toJar in interface DynamicType
        Parameters:
        file - The target file to which the jar is written to.
        manifest - The manifest of the created jar.
        Returns:
        The given file.
        Throws:
        java.io.IOException - If an I/O exception occurs while writing the file.