Package: groovy.lang

## [Java] Interface MetaClassRegistry

- A MetaClassRegistry is an object that is responsible for managing the a cache of MetaClass instances. Each java.lang.Class instance has an associated MetaClass and client code can query this interface for the MetaClass for a given associated java.lang.Class

  See Also:
    MetaClass
  Authors:
    John Wilson
    Graeme Rocher
    Jochen Theodorou

- - ### Nested Class Summary

    Nested classes
    Modifiers | Name | Description
    --- | --- | ---
    `class` | `MetaClassRegistry.MetaClassCreationHandle` | Class used as base for the creation of MetaClass implementations.

  - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `void` | `addMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)` Adds a meta class change listener for constant meta classes
    `` | `void` | `addNonRemovableMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)` Adds a meta class change listener for constant meta classes.
    `` | `MetaClass` | `getMetaClass(Class theClass)` The main function of the registry If a meta class exists then return it otherwise create one, put it in the registry and return it
    `` | `MetaClassRegistry.MetaClassCreationHandle` | `getMetaClassCreationHandler()` Retrieves the MetaClassCreationHandle that is responsible for constructing MetaClass instances
    `` | `MetaClassRegistryChangeEventListener[]` | `getMetaClassRegistryChangeEventListeners()` Returns all registered class change listener for constant meta classes.
    `` | `Iterator` | `iterator()` Gets a snapshot of the current constant meta classes and returns it as Iterator.
    `` | `void` | `removeMetaClass(Class theClass)` Removes a cached MetaClass from the registry
    `` | `void` | `removeMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)` Removes a meta class change listener for constant meta classes
    `` | `void` | `setMetaClass(Class theClass, MetaClass theMetaClass)` Adds a metaclass to the registry for the given class
    `` | `void` | `setMetaClassCreationHandle(MetaClassRegistry.MetaClassCreationHandle handle)` Sets the MetaClassCreationHandle instance that is responsible for constructing instances

- - ### Method Detail

    - #### public void addMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)

      Adds a meta class change listener for constant meta classes

      Parameters:
        `listener` - - the update listener

    - #### public void addNonRemovableMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)

      Adds a meta class change listener for constant meta classes. This listener cannot be removed!

      Parameters:
        `listener` - - the update listener

    - #### public MetaClass getMetaClass(Class theClass)

      The main function of the registry If a meta class exists then return it otherwise create one, put it in the registry and return it

    - #### public MetaClassRegistry.MetaClassCreationHandle getMetaClassCreationHandler()

      Retrieves the MetaClassCreationHandle that is responsible for constructing MetaClass instances

      Returns:
        The MetaClassCreationHandle instance

    - #### public MetaClassRegistryChangeEventListener[] getMetaClassRegistryChangeEventListeners()

      Returns all registered class change listener for constant meta classes.

      Returns:
        an array containing all change listener

    - #### public Iterator iterator()

      Gets a snapshot of the current constant meta classes and returns it as Iterator. Modifications done using this Iterator will not cause a ConcurrentModificationException. If a MetaClass is removed using this Iterator, then the MetaClass will only be removed if the MetaClass was not replaced by another MetaClass in the meantime. If a MetaClass is added while using this Iterator, then it will be part of the Iteration. If a MetaClass replaces another constant meta class, then the Iteration might show two meta classes for the same class.

      Note: This Iterator may not used with multiple threads.

      Returns:
        Iterator for the constant meta classes

    - #### public void removeMetaClass(Class theClass)

      Removes a cached MetaClass from the registry

      Parameters:
        `theClass` - The Java class of the MetaClass to remove

    - #### public void removeMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)

      Removes a meta class change listener for constant meta classes

      Parameters:
        `listener` - - the update listener

    - #### public void setMetaClass(Class theClass, MetaClass theMetaClass)

      Adds a metaclass to the registry for the given class

      Parameters:
        `theClass` - The class
        `theMetaClass` - The MetaClass for theClass

    - #### public void setMetaClassCreationHandle(MetaClassRegistry.MetaClassCreationHandle handle)

      Sets the MetaClassCreationHandle instance that is responsible for constructing instances

      Parameters:
        `handle` - The handle instance