org.codehaus.groovy.runtime.metaclass
Class MetaClassRegistryImpl

java.lang.Object
  extended by org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl
All Implemented Interfaces:
MetaClassRegistry

public class MetaClassRegistryImpl
extends java.lang.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: 16242 $
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
private  java.util.LinkedList changeListenerList
           
static int DONT_LOAD_DEFAULT
           
private static MetaClassRegistry instanceExclude
           
private static MetaClassRegistry instanceInclude
           
private  FastArray instanceMethods
           
static int LOAD_DEFAULT
           
private  MetaClassRegistry.MetaClassCreationHandle metaClassCreationHandle
           
private  ManagedLinkedList metaClassInfo
           
private  FastArray staticMethods
           
private  boolean useAccessible
           
 
Constructor Summary
MetaClassRegistryImpl()
           
MetaClassRegistryImpl(boolean useAccessible)
           
MetaClassRegistryImpl(int loadDefault)
           
MetaClassRegistryImpl(int loadDefault, boolean useAccessible)
           
 
Method Summary
 void addMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)
          Adds a listener for constant meta classes.
private  void createMetaMethodFromClass(java.util.Map map, java.lang.Class aClass)
           
protected  void fireConstantMetaClassUpdate(java.lang.Class c, MetaClass newMc)
          Causes the execution of all registered listeners.
static MetaClassRegistry getInstance(int includeExtension)
          Singleton of MetaClassRegistry.
 FastArray getInstanceMethods()
           
 MetaClass getMetaClass(java.lang.Class theClass)
           
 MetaClass getMetaClass(java.lang.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.
 FastArray getStaticMethods()
           
private  void installMetaClassCreationHandle()
          Looks for a class called 'groovy.runtime.metaclass.CustomMetaClassCreationHandle' and if it exists uses it as the MetaClassCreationHandle otherwise uses the default
 java.util.Iterator iterator()
          Returns an iterator to iterate over all constant meta classes.
private  void registerMethods(java.lang.Class theClass, boolean useMethodrapper, boolean useInstanceMethods, java.util.Map map)
           
 void removeMetaClass(java.lang.Class theClass)
          Removes a cached MetaClass from the registry
 void removeMetaClassRegistryChangeEventListener(MetaClassRegistryChangeEventListener listener)
          Removes a constant meta class listener.
 void setMetaClass(java.lang.Class theClass, MetaClass theMetaClass)
          Registers a new MetaClass in the registry to customize the type
private  void setMetaClass(java.lang.Class theClass, MetaClass oldMc, MetaClass newMc)
          if oldMc is null, newMc will replace whatever meta class was used before.
 void setMetaClass(java.lang.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

useAccessible

private boolean useAccessible

instanceMethods

private FastArray instanceMethods

staticMethods

private FastArray staticMethods

changeListenerList

private java.util.LinkedList changeListenerList

metaClassInfo

private ManagedLinkedList metaClassInfo

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

instanceInclude

private static MetaClassRegistry instanceInclude

instanceExclude

private static MetaClassRegistry instanceExclude

metaClassCreationHandle

private volatile MetaClassRegistry.MetaClassCreationHandle metaClassCreationHandle
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

installMetaClassCreationHandle

private void installMetaClassCreationHandle()
Looks for a class called 'groovy.runtime.metaclass.CustomMetaClassCreationHandle' and if it exists uses it as the MetaClassCreationHandle otherwise uses the default

See Also:
MetaClassRegistry.MetaClassCreationHandle

registerMethods

private void registerMethods(java.lang.Class theClass,
                             boolean useMethodrapper,
                             boolean useInstanceMethods,
                             java.util.Map map)

createMetaMethodFromClass

private void createMetaMethodFromClass(java.util.Map map,
                                       java.lang.Class aClass)

getMetaClass

public final MetaClass getMetaClass(java.lang.Class theClass)
Specified by:
getMetaClass in interface MetaClassRegistry

getMetaClass

public MetaClass getMetaClass(java.lang.Object obj)

setMetaClass

private void setMetaClass(java.lang.Class theClass,
                          MetaClass oldMc,
                          MetaClass newMc)
if oldMc is null, newMc will replace whatever meta class was used before. if oldMc is not null, then newMc will be used only if he stored mc is the same as oldMc


removeMetaClass

public void removeMetaClass(java.lang.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(java.lang.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(java.lang.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

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(java.lang.Class c,
                                           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:
c - the class
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 -

getInstanceMethods

public FastArray getInstanceMethods()

getStaticMethods

public FastArray getStaticMethods()

iterator

public java.util.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.


Copyright © ${year} The Codehaus. All Rights Reserved.