Class InjectionClassLoader

  • Direct Known Subclasses:
    ByteArrayClassLoader, MultipleParentClassLoader

    public abstract class InjectionClassLoader
    extends java.lang.ClassLoader

    An injection class loader allows for the injection of a class after the class loader was created. Injection is only possible if this class loader is not sealed.

    Important: Not sealing a class loader allows to break package encapsulation for anybody getting hold of a reference to this class loader.

    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      static class  InjectionClassLoader.Strategy
      A class loading strategy for adding a type to an injection class loader.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private boolean sealed
      Indicates if this class loader is sealed, i.e.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      protected InjectionClassLoader​(java.lang.ClassLoader parent, boolean sealed)
      Creates a new injection class loader.
    • Method Summary

      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      java.lang.Class<?> defineClass​(java.lang.String name, byte[] binaryRepresentation)
      Defines a new type to be loaded by this class loader.
      java.util.Map<java.lang.String,​java.lang.Class<?>> defineClasses​(java.util.Map<java.lang.String,​byte[]> typeDefinitions)
      Defines a group of types to be loaded by this class loader.
      protected abstract java.util.Map<java.lang.String,​java.lang.Class<?>> doDefineClasses​(java.util.Map<java.lang.String,​byte[]> typeDefinitions)
      Defines a group of types to be loaded by this class loader.
      boolean isSealed()
      Returns true if this class loader is sealed.
      • Methods inherited from class java.lang.ClassLoader

        clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findClass, findClass, findLibrary, findLoadedClass, findResource, findResource, findResources, findSystemClass, getClassLoadingLock, getDefinedPackage, getDefinedPackages, getName, getPackage, getPackages, getParent, getPlatformClassLoader, getResource, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, getUnnamedModule, isRegisteredAsParallelCapable, loadClass, loadClass, registerAsParallelCapable, resolveClass, resources, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
      • Methods inherited from class java.lang.Object

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

      • sealed

        private final boolean sealed
        Indicates if this class loader is sealed, i.e. forbids runtime injection.
    • Constructor Detail

      • InjectionClassLoader

        protected InjectionClassLoader​(java.lang.ClassLoader parent,
                                       boolean sealed)
        Creates a new injection class loader.
        Parameters:
        parent - The class loader's parent.
        sealed - Indicates if this class loader is sealed, i.e. forbids runtime injection.
    • Method Detail

      • isSealed

        public boolean isSealed()
        Returns true if this class loader is sealed.
        Returns:
        true if this class loader is sealed.
      • defineClass

        public java.lang.Class<?> defineClass​(java.lang.String name,
                                              byte[] binaryRepresentation)
                                       throws java.lang.ClassNotFoundException
        Defines a new type to be loaded by this class loader.
        Parameters:
        name - The name of the type.
        binaryRepresentation - The type's binary representation.
        Returns:
        The defined class or a previously defined class.
        Throws:
        java.lang.ClassNotFoundException - If the class could not be loaded.
      • defineClasses

        public java.util.Map<java.lang.String,​java.lang.Class<?>> defineClasses​(java.util.Map<java.lang.String,​byte[]> typeDefinitions)
                                                                               throws java.lang.ClassNotFoundException
        Defines a group of types to be loaded by this class loader. If this class loader is sealed, an IllegalStateException is thrown.
        Parameters:
        typeDefinitions - The types binary representations.
        Returns:
        The mapping of defined classes or previously defined classes by their name.
        Throws:
        java.lang.ClassNotFoundException - If the class could not be loaded.
      • doDefineClasses

        protected abstract java.util.Map<java.lang.String,​java.lang.Class<?>> doDefineClasses​(java.util.Map<java.lang.String,​byte[]> typeDefinitions)
                                                                                             throws java.lang.ClassNotFoundException
        Defines a group of types to be loaded by this class loader.
        Parameters:
        typeDefinitions - The types binary representations.
        Returns:
        The mapping of defined classes or previously defined classes by their name.
        Throws:
        java.lang.ClassNotFoundException - If the class could not be loaded.