org.codehaus.groovy.runtime.metaclass

## Class MetaClassRegistryImpl

- java.lang.Object
- - org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl

- All Implemented Interfaces:
    MetaClassRegistry

      public class MetaClassRegistryImpl
      extends Object
      implements MetaClassRegistry

  A registry of MetaClass instances which caches introspection & reflection information and allows methods to be dynamically added to existing classes at runtime
  Version:
    $Revision$
  Author:
    James Strachan, John Wilson, Jochen Theodorou, Graeme Rocher, Alex Tkachman

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from interface groovy.lang.MetaClassRegistry

      `MetaClassRegistry.MetaClassCreationHandle`

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static int` | `DONT_LOAD_DEFAULT`
    `static int` | `LOAD_DEFAULT`
    `static String` | `MODULE_META_INF_FILE` Deprecated. Use `instead`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `MetaClassRegistryImpl()`
    `MetaClassRegistryImpl(boolean useAccessible)`
    `MetaClassRegistryImpl(int loadDefault)`
    `MetaClassRegistryImpl(int loadDefault, boolean useAccessible)`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `addMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)` Adds a listener for constant meta classes.
    `void` | `addNonRemovableMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)` Adds a listener for constant meta classes.
    `protected void` | `fireConstantMetaClassUpdate(Object obj, Class c, MetaClass oldMC, MetaClass newMc)` Causes the execution of all registered listeners.
    `static MetaClassRegistry` | `getInstance(int includeExtension)` Singleton of MetaClassRegistry.
    `FastArray` | `getInstanceMethods()`
    `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
    `MetaClass` | `getMetaClass(Object obj)`
    `MetaClassRegistry.MetaClassCreationHandle` | `getMetaClassCreationHandler()` Gets a handle internally used to create MetaClass implementations WARNING: experimental code, likely to change soon
    `MetaClassRegistryChangeEventListener[]` | `getMetaClassRegistryChangeEventListeners()` Gets an array of of all registered ConstantMetaClassListener instances.
    `ExtensionModuleRegistry` | `getModuleRegistry()`
    `FastArray` | `getStaticMethods()`
    `Iterator` | `iterator()` Returns an iterator to iterate over all constant meta classes.
    `void` | `registerExtensionModuleFromProperties(Properties properties, ClassLoader classLoader, Map<CachedClass,List<MetaMethod>> map)`
    `void` | `removeMetaClass(Class theClass)` Removes a cached MetaClass from the registry
    `void` | `removeMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)` Removes a constant meta class listener.
    `void` | `setMetaClass(Class theClass, MetaClass theMetaClass)` Registers a new MetaClass in the registry to customize the type
    `void` | `setMetaClass(Object obj, MetaClass theMetaClass)`
    `void` | `setMetaClassCreationHandle(MetaClassRegistry.MetaClassCreationHandle handle)` Sets a handle internally used to create MetaClass implementations.
    `boolean` | `useAccessible()`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### MODULE_META_INF_FILE

          public static final String MODULE_META_INF_FILE

      Deprecated. Use `instead`
      See Also:
        Constant Field Values

    - #### LOAD_DEFAULT

          public static final int LOAD_DEFAULT

      See Also:
        Constant Field Values

    - #### DONT_LOAD_DEFAULT

          public static final int DONT_LOAD_DEFAULT

      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### MetaClassRegistryImpl

          public MetaClassRegistryImpl()

    - #### MetaClassRegistryImpl

          public MetaClassRegistryImpl(int loadDefault)

    - #### MetaClassRegistryImpl

          public MetaClassRegistryImpl(boolean useAccessible)

      Parameters:
        `useAccessible` - defines whether or not the `AccessibleObject.setAccessible(boolean)` method will be called to enable access to all methods when using reflection

    - #### MetaClassRegistryImpl

          public MetaClassRegistryImpl(int loadDefault,
                               boolean useAccessible)

  - ### Method Detail

    - #### registerExtensionModuleFromProperties

          public void registerExtensionModuleFromProperties(Properties properties,
                                                   ClassLoader classLoader,
                                                   Map<CachedClass,List<MetaMethod>> map)

    - #### getModuleRegistry

          public ExtensionModuleRegistry getModuleRegistry()

    - #### getMetaClass

          public final MetaClass getMetaClass(Class theClass)

      Description copied from interface: `MetaClassRegistry`
      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
      Specified by:
        `getMetaClass` in interface `MetaClassRegistry`

    - #### getMetaClass

          public MetaClass getMetaClass(Object obj)

    - #### removeMetaClass

          public void removeMetaClass(Class theClass)

      Description copied from interface: `MetaClassRegistry`
      Removes a cached MetaClass from the registry
      Specified by:
        `removeMetaClass` in interface `MetaClassRegistry`
      Parameters:
        `theClass` - The Java class of the MetaClass to remove

    - #### setMetaClass

          public void setMetaClass(Class theClass,
                          MetaClass theMetaClass)

      Registers a new MetaClass in the registry to customize the type
      Specified by:
        `setMetaClass` in interface `MetaClassRegistry`
      Parameters:
        `theClass` -
        `theMetaClass` -

    - #### setMetaClass

          public void setMetaClass(Object obj,
                          MetaClass theMetaClass)

    - #### useAccessible

          public boolean useAccessible()

    - #### getMetaClassCreationHandler

          public MetaClassRegistry.MetaClassCreationHandle getMetaClassCreationHandler()

      Gets a handle internally used to create MetaClass implementations WARNING: experimental code, likely to change soon
      Specified by:
        `getMetaClassCreationHandler` in interface `MetaClassRegistry`
      Returns:
        the handle

    - #### setMetaClassCreationHandle

          public void setMetaClassCreationHandle(MetaClassRegistry.MetaClassCreationHandle handle)

      Sets a handle internally used to create MetaClass implementations. When replacing the handle with a custom version, you should reuse the old handle to keep custom logic and to use the default logic as fall back. WARNING: experimental code, likely to change soon
      Specified by:
        `setMetaClassCreationHandle` in interface `MetaClassRegistry`
      Parameters:
        `handle` - the handle

    - #### addMetaClassRegistryChangeEventListener

          public void addMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)

      Adds a listener for constant meta classes.
      Specified by:
        `addMetaClassRegistryChangeEventListener` in interface `MetaClassRegistry`
      Parameters:
        `listener` - the listener

    - #### addNonRemovableMetaClassRegistryChangeEventListener

          public void addNonRemovableMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)

      Adds a listener for constant meta classes. This listener cannot be removed!
      Specified by:
        `addNonRemovableMetaClassRegistryChangeEventListener` in interface `MetaClassRegistry`
      Parameters:
        `listener` - the listener

    - #### removeMetaClassRegistryChangeEventListener

          public void removeMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)

      Removes a constant meta class listener.
      Specified by:
        `removeMetaClassRegistryChangeEventListener` in interface `MetaClassRegistry`
      Parameters:
        `listener` - the listener

    - #### fireConstantMetaClassUpdate

          protected void fireConstantMetaClassUpdate(Object obj,
                                         Class c,
                                         MetaClass oldMC,
                                         MetaClass newMc)

      Causes the execution of all registered listeners. This method is used mostly internal to kick of the listener notification. It can also be used by subclasses to achieve the same.
      Parameters:
        `obj` - object instance if the MetaClass change is on a per-instance metaclass (or null if global)
        `c` - the class
        `oldMC` - the old MetaClass
        `newMc` - the new MetaClass

    - #### getMetaClassRegistryChangeEventListeners

          public MetaClassRegistryChangeEventListener[] getMetaClassRegistryChangeEventListeners()

      Gets an array of of all registered ConstantMetaClassListener instances.
      Specified by:
        `getMetaClassRegistryChangeEventListeners` in interface `MetaClassRegistry`
      Returns:
        an array containing all change listener

    - #### getInstance

          public static MetaClassRegistry getInstance(int includeExtension)

      Singleton of MetaClassRegistry.
      Parameters:
        `includeExtension` -
      Returns:
        the registry

    - #### getInstanceMethods

          public FastArray getInstanceMethods()

    - #### getStaticMethods

          public FastArray getStaticMethods()

    - #### iterator

          public Iterator iterator()

      Returns an iterator to iterate over all constant meta classes. This iterator can be seen as making a snapshot of the current state of the registry. The snapshot will include all meta classes that has been used unless they are already collected. Collected meta classes will be skipped automatically, so you can expect that each element of the iteration is not null. Calling this method is thread safe, the usage of the iterator is not.
      Specified by:
        `iterator` in interface `MetaClassRegistry`
      Returns:
        the iterator.