Class DynamicClassLoader

java.lang.Object
java.lang.ClassLoader
org.eclipse.persistence.dynamic.DynamicClassLoader
Direct Known Subclasses:
DynamicRestClassLoader

public class DynamicClassLoader extends ClassLoader
This custom ClassLoader provides support for dynamically generating classes within an EclipseLink application using byte codes created using a DynamicClassWriter. A DynamicClassLoader requires a parent or delegate class-loader which is provided to the constructor. This delegate class loader handles the lookup and storage of all created classes.
Author:
dclarke, mnorman
  • Field Details

    • classWriters

      protected Map<String,EclipseLinkClassWriter> classWriters
      Map of DynamicClassWriter used to dynamically create a class in the findClass(String) call. The application must register classes using addClass or createDynameClass prior to the findClass(String) being invoked.

      The map of writers is maintained for the life of this DynamicClassLoader instance to ensure additional requests to create dynamic classes of the same name are properly verified. Duplicate requests for dynamic classes of the same name, same writer type, and the same parent class are permitted but different parent classes or different writer types are not.

    • enumInfoRegistry

      protected Map<String,DynamicClassLoader.EnumInfo> enumInfoRegistry
    • defaultWriter

      public DynamicClassWriter defaultWriter
      Default writer to use if one is not specified.
  • Constructor Details

  • Method Details

    • getDefaultWriter

      public DynamicClassWriter getDefaultWriter()
    • getClassWriters

      protected Map<String,EclipseLinkClassWriter> getClassWriters()
    • getClassWriter

      public EclipseLinkClassWriter getClassWriter(String className)
    • addEnum

      public void addEnum(String className, Object... literalLabels)
    • addClass

      public void addClass(String className)
      Register a class to be dynamically created using the default DynamicClassWriter.
      See Also:
    • addClass

      public void addClass(String className, Class<?> parentClass)
      Register a class to be dynamically created using a copy of default DynamicClassWriter but specifying a different parent class.
      See Also:
    • addClass

      public void addClass(String className, EclipseLinkClassWriter writer) throws DynamicException
      Register a class to be dynamically created using the provided DynamicClassWriter. The registered writer is used when the findClass(String) method is called back on this loader from the ClassLoader.loadClass(String) call.

      If a duplicate request is made for the same className and the writers are not compatible a DynamicException will be thrown. If the duplicate request contains a compatible writer then the second request is ignored as the class may already have been generated.

      Throws:
      DynamicException
      See Also:
    • createDynamicClass

      public Class<?> createDynamicClass(String className, DynamicClassWriter writer)
      Create a dynamic class registering a writer and then forcing the provided class name to be loaded.
    • checkAssignable

      protected Class<?> checkAssignable(Class<?> clz)
    • createDynamicClass

      public Class<?> createDynamicClass(String className)
      Create a new dynamic entity type for the specified name assuming the use of the default writer and its default parent class.
      See Also:
    • createDynamicClass

      public Class<?> createDynamicClass(String className, Class<?> parentClass)
      Create a new dynamic entity type for the specified name with the specified parent class.
      See Also:
    • createDynamicAdapter

      public void createDynamicAdapter(String className)
      Create an adapter for given className
      Parameters:
      className -
    • createDynamicCollectionAdapter

      public void createDynamicCollectionAdapter(String className)
      Create a collection adapter for given className
      Parameters:
      className -
    • createDynamicReferenceAdapter

      public void createDynamicReferenceAdapter(String className)
      Create a reference for given className
      Parameters:
      className -
    • findClass

      protected Class<?> findClass(String className) throws ClassNotFoundException
      Create a new dynamic class if a ClassWriter is registered for the provided className. This code is single threaded to ensure only one class is created for a given name and that the ClassWriter is removed afterwards.
      Overrides:
      findClass in class ClassLoader
      Throws:
      ClassNotFoundException
    • defineDynamicClass

      protected Class<?> defineDynamicClass(String name, byte[] b)
      Converts an array of bytes into an instance of class Class. Before the Class can be used it must be resolved.
      Parameters:
      name -
      b -
      Throws:
      ClassFormatError
    • lookup

      public static DynamicClassLoader lookup(Session session)
      Lookup the DynamicConversionManager for the given session. If the existing ConversionManager is not an instance of DynamicConversionManager then create a new one and replace the existing one.
      Parameters:
      session -
      Returns: