|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectgroovy.lang.MetaClassImpl
groovy.lang.ExpandoMetaClass
public class ExpandoMetaClass
A MetaClass that implements GroovyObject and behaves like an Expando, allowing the addition of new methods on the fly.
Some examples of usage:
By default methods are only allowed to be added before initialize() is called. In other words you create a new
ExpandoMetaClass, add some methods and then call initialize(). If you attempt to add new methods after initialize()
has been called an error will be thrown.This is to ensure that the MetaClass can operate appropriately in multi
threaded environments as it forces you to do all method additions at the beginning, before using the MetaClass.
ExpandoMetaClass differs here from the default in that it allows you adding methods after initialize has been called.
This is done by setting the initialize flag internally to false and then add the methods. Since this is not thread
safe it has to be done in a synchronized block. The methods to check for modification and initialization are
therefore synchronized as well. Any method call done through this meta class will first check if the it is
synchronized. Should this happen during a modification, then the method cannot be selected or called unless the
modification is completed.
WARNING: This MetaClass uses a thread-bound ThreadLocal instance to store and retrieve properties.
In addition properties stored use soft references so they are both bound by the life of the Thread and by the soft
references. The implication here is you should NEVER use dynamic properties if you want their values to stick around
for long periods because as soon as the JVM is running low on memory or the thread dies they will be garbage collected.
// defines or replaces instance method:
metaClass.myMethod = { args -> }
// defines a new instance method
metaClass.myMethod << { args -> }
// creates multiple overloaded methods of the same name
metaClass.myMethod << { String s -> } << { Integer i -> }
// defines or replaces a static method with the 'static' qualifier
metaClass.'static'.myMethod = { args -> }
// defines a new static method with the 'static' qualifier
metaClass.'static'.myMethod << { args -> }
// defines a new constructor
metaClass.constructor << { String arg -> }
// defines or replaces a constructor
metaClass.constructor = { String arg -> }
// defines a new property with an initial value of "blah"
metaClass.myProperty = "blah"
Nested Class Summary | |
---|---|
protected class |
ExpandoMetaClass.ExpandoMetaConstructor
Handles the ability to use the left shift operator to append new constructors |
protected class |
ExpandoMetaClass.ExpandoMetaProperty
Instances of this class are returned when using the << left shift operator. |
Nested classes/interfaces inherited from class groovy.lang.MetaClassImpl |
---|
MetaClassImpl.Index |
Field Summary | |
---|---|
static String |
CONSTRUCTOR
|
boolean |
inRegistry
|
static String |
STATIC_QUALIFIER
|
Fields inherited from class groovy.lang.MetaClassImpl |
---|
getPropertyMethod, INVOKE_METHOD_METHOD, invokeMethodMethod, isGroovyObject, isMap, metaMethodIndex, METHOD_MISSING, PROPERTY_MISSING, registry, setPropertyMethod, STATIC_METHOD_MISSING, STATIC_PROPERTY_MISSING, theCachedClass, theClass |
Constructor Summary | |
---|---|
ExpandoMetaClass(Class theClass)
Constructs a new ExpandoMetaClass instance for the given class |
|
ExpandoMetaClass(Class theClass,
boolean register)
Constructs a new ExpandoMetaClass instance for the given class optionally placing the MetaClass in the MetaClassRegistry automatically |
|
ExpandoMetaClass(Class theClass,
boolean register,
boolean allowChangesAfterInit)
Constructs a new ExpandoMetaClass instance for the given class optionally placing the MetaClass in the MetaClassRegistry automatically |
|
ExpandoMetaClass(Class theClass,
boolean register,
MetaMethod[] add)
|
|
ExpandoMetaClass(Class theClass,
MetaMethod[] add)
|
Method Summary | |
---|---|
void |
addMixinClass(MixinInMetaClass mixin)
|
Object |
castToMixedType(Object obj,
Class type)
|
CallSite |
createConstructorSite(CallSite site,
Object[] args)
|
CallSite |
createPogoCallCurrentSite(CallSite site,
Class sender,
String name,
Object[] args)
|
CallSite |
createPogoCallSite(CallSite site,
Object[] args)
|
CallSite |
createPojoCallSite(CallSite site,
Object receiver,
Object[] args)
|
CallSite |
createStaticSite(CallSite site,
Object[] args)
|
ExpandoMetaClass |
define(Closure closure)
|
static void |
disableGlobally()
Call to disable the global use of ExpandoMetaClass |
static void |
enableGlobally()
Call to enable global use of global use of ExpandoMetaClass within the registry. |
MetaMethod |
findMixinMethod(String methodName,
Class[] arguments)
|
List<MetaMethod> |
getExpandoMethods()
Returns a list of expando MetaMethod instances added to this ExpandoMetaClass |
Collection<MetaProperty> |
getExpandoProperties()
Returns a list of MetaBeanProperty instances added to this ExpandoMetaClass |
Collection |
getExpandoSubclassMethods()
|
Class |
getJavaClass()
|
MetaClass |
getMetaClass()
Returns the metaclass for a given class. |
MetaProperty |
getMetaProperty(String name)
Looks up an existing MetaProperty by name |
List<MetaMethod> |
getMethods()
Overrides the behavior of parent getMethods() method to make MetaClass aware of added Expando methods |
List<MetaProperty> |
getProperties()
Get all the properties defined for this type |
Object |
getProperty(Class sender,
Object object,
String name,
boolean useSuper,
boolean fromInsideClass)
Overrides default implementation just in case getProperty method has been overridden by ExpandoMetaClass |
Object |
getProperty(Object object,
String name)
Overrides default implementation just in case getProperty method has been overriden by ExpandoMetaClass |
Object |
getProperty(String property)
Retrieves a property value. |
String |
getPropertyForSetter(String setterName)
Returns a property name equivalent for the given setter name or null if it is not a getter |
protected Object |
getSubclassMetaMethods(String methodName)
|
boolean |
hasMetaMethod(String name,
Class[] args)
Checks whether a MetaMethod for the given name and arguments exists |
boolean |
hasMetaProperty(String name)
Returns true if the MetaClass has the given property |
void |
initialize()
complete the initlialisation process. |
Object |
invokeConstructor(Object[] arguments)
Invokes a constructor for the given arguments. |
Object |
invokeMethod(Class sender,
Object object,
String methodName,
Object[] originalArguments,
boolean isCallToSuper,
boolean fromInsideClass)
Overrides default implementation just in case invokeMethod has been overriden by ExpandoMetaClass |
Object |
invokeMethod(String name,
Object args)
Invokes the given method. |
Object |
invokeStaticMethod(Object object,
String methodName,
Object[] arguments)
Overrides default implementation just in case a static invoke method has been set on ExpandoMetaClass |
protected boolean |
isInitialized()
Checks if the meta class is initialized. |
boolean |
isModified()
Return whether the MetaClass has been modified or not |
boolean |
isSetter(String name,
CachedClass[] args)
|
static boolean |
isValidExpandoProperty(String property)
|
protected void |
onGetPropertyFoundInHierarchy(MetaMethod method)
|
protected void |
onInvokeMethodFoundInHierarchy(MetaMethod method)
|
protected void |
onSetPropertyFoundInHierarchy(MetaMethod method)
|
protected void |
onSuperMethodFoundInHierarchy(MetaMethod method)
|
protected void |
onSuperPropertyFoundInHierarchy(MetaBeanProperty property)
|
protected void |
performOperationOnMetaClass(groovy.lang.ExpandoMetaClass.Callable c)
|
void |
refreshInheritedMethods(Set modifiedSuperExpandos)
Called from ExpandoMetaClassCreationHandle in the registry if it exists to set up inheritance handling |
void |
registerBeanProperty(String property,
Object newValue)
Registers a new bean property |
void |
registerInstanceMethod(MetaMethod metaMethod)
Registers a new instance method for the given method name and closure on this MetaClass |
void |
registerInstanceMethod(String name,
Closure closure)
|
protected void |
registerStaticMethod(String name,
Closure callable)
|
protected void |
registerStaticMethod(String name,
Closure callable,
Class[] paramTypes)
Registers a new static method for the given method name and closure on this MetaClass |
void |
registerSubclassInstanceMethod(MetaMethod metaMethod)
|
void |
registerSubclassInstanceMethod(String name,
Class klazz,
Closure closure)
|
protected void |
setInitialized(boolean b)
|
void |
setMetaClass(MetaClass metaClass)
Allows the MetaClass to be replaced with a derived implementation. |
void |
setProperty(Class sender,
Object object,
String name,
Object newValue,
boolean useSuper,
boolean fromInsideClass)
Overrides default implementation just in case setProperty method has been overriden by ExpandoMetaClass |
void |
setProperty(String property,
Object newValue)
Sets the given property to the new value. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
---|
public static final String STATIC_QUALIFIER
public static final String CONSTRUCTOR
public boolean inRegistry
Constructor Detail |
---|
public ExpandoMetaClass(Class theClass)
theClass
- The class that the MetaClass applies topublic ExpandoMetaClass(Class theClass, MetaMethod[] add)
public ExpandoMetaClass(Class theClass, boolean register)
theClass
- The class that the MetaClass applies toregister
- True if the MetaClass should be registered inside the MetaClassRegistry. This defaults to true and ExpandoMetaClass will effect all instances if changedpublic ExpandoMetaClass(Class theClass, boolean register, MetaMethod[] add)
public ExpandoMetaClass(Class theClass, boolean register, boolean allowChangesAfterInit)
theClass
- The class that the MetaClass applies toregister
- True if the MetaClass should be registered inside the MetaClassRegistry. This defaults to true and ExpandoMetaClass will effect all instances if changedallowChangesAfterInit
- Should the meta class be modifiable after initialization. Default is false.Method Detail |
---|
public Collection getExpandoSubclassMethods()
public MetaMethod findMixinMethod(String methodName, Class[] arguments)
findMixinMethod
in class MetaClassImpl
protected void onInvokeMethodFoundInHierarchy(MetaMethod method)
onInvokeMethodFoundInHierarchy
in class MetaClassImpl
protected void onSuperMethodFoundInHierarchy(MetaMethod method)
onSuperMethodFoundInHierarchy
in class MetaClassImpl
protected void onSuperPropertyFoundInHierarchy(MetaBeanProperty property)
onSuperPropertyFoundInHierarchy
in class MetaClassImpl
protected void onSetPropertyFoundInHierarchy(MetaMethod method)
onSetPropertyFoundInHierarchy
in class MetaClassImpl
protected void onGetPropertyFoundInHierarchy(MetaMethod method)
onGetPropertyFoundInHierarchy
in class MetaClassImpl
public boolean isModified()
MutableMetaClass
isModified
in interface MutableMetaClass
isModified
in class MetaClassImpl
public void registerSubclassInstanceMethod(String name, Class klazz, Closure closure)
public void registerSubclassInstanceMethod(MetaMethod metaMethod)
public void addMixinClass(MixinInMetaClass mixin)
public Object castToMixedType(Object obj, Class type)
public static void enableGlobally()
public static void disableGlobally()
public void initialize()
MetaClass
initialize
in interface MetaClass
initialize
in class MetaClassImpl
protected boolean isInitialized()
isInitialized
in class MetaClassImpl
MetaClassImpl.isInitialized()
protected void setInitialized(boolean b)
public Object invokeConstructor(Object[] arguments)
MetaObjectProtocol
invokeConstructor
in interface MetaObjectProtocol
invokeConstructor
in class MetaClassImpl
arguments
- The arguments to the constructor
public MetaClass getMetaClass()
GroovyObject
getMetaClass
in interface GroovyObject
public Object getProperty(String property)
GroovyObject
getProperty
in interface GroovyObject
property
- the name of the property of interest
public static boolean isValidExpandoProperty(String property)
public Object invokeMethod(String name, Object args)
GroovyObject
invokeMethod
in interface GroovyObject
name
- the name of the method to callargs
- the arguments to use for the method call
public void setMetaClass(MetaClass metaClass)
GroovyObject
setMetaClass
in interface GroovyObject
metaClass
- the new metaclasspublic void setProperty(String property, Object newValue)
GroovyObject
setProperty
in interface GroovyObject
property
- the name of the property of interestnewValue
- the new value for the propertypublic ExpandoMetaClass define(Closure closure)
protected void performOperationOnMetaClass(groovy.lang.ExpandoMetaClass.Callable c)
public void registerBeanProperty(String property, Object newValue)
property
- The property namenewValue
- The properties initial valuepublic void registerInstanceMethod(MetaMethod metaMethod)
metaMethod
- public void registerInstanceMethod(String name, Closure closure)
public List<MetaMethod> getMethods()
getMethods
in interface MetaClass
getMethods
in interface MetaObjectProtocol
getMethods
in class MetaClassImpl
MetaObjectProtocol.getMethods()
public List<MetaProperty> getProperties()
MetaClassImpl
getProperties
in interface MetaClass
getProperties
in interface MetaObjectProtocol
getProperties
in class MetaClassImpl
MetaProperty
protected void registerStaticMethod(String name, Closure callable)
protected void registerStaticMethod(String name, Closure callable, Class[] paramTypes)
name
- The method namecallable
- The callable Closureprotected Object getSubclassMetaMethods(String methodName)
getSubclassMetaMethods
in class MetaClassImpl
public Class getJavaClass()
public void refreshInheritedMethods(Set modifiedSuperExpandos)
modifiedSuperExpandos
- A list of modified super ExpandoMetaClasspublic List<MetaMethod> getExpandoMethods()
public Collection<MetaProperty> getExpandoProperties()
public Object invokeMethod(Class sender, Object object, String methodName, Object[] originalArguments, boolean isCallToSuper, boolean fromInsideClass)
invokeMethod
in interface MetaClass
invokeMethod
in class MetaClassImpl
sender
- The java.lang.Class instance that invoked the methodobject
- The object which the method was invoked onmethodName
- The name of the methodoriginalArguments
- The arguments to the methodisCallToSuper
- Whether the method is a call to a super class methodfromInsideClass
- Whether the call was invoked from the inside or the outside of the class
MetaClassImpl.invokeMethod(Class, Object, String, Object[], boolean, boolean)
public Object invokeStaticMethod(Object object, String methodName, Object[] arguments)
invokeStaticMethod
in interface MetaObjectProtocol
invokeStaticMethod
in class MetaClassImpl
object
- An instance of the class returned by the getTheClass() method or the class itselfmethodName
- The name of the methodarguments
- The arguments to the method
MetaClassImpl.invokeStaticMethod(Object, String, Object[])
public Object getProperty(Class sender, Object object, String name, boolean useSuper, boolean fromInsideClass)
getProperty
in interface MetaClass
getProperty
in class MetaClassImpl
sender
- The java.lang.Class instance that requested the propertyobject
- The Object which the property is being retrieved fromname
- The name of the propertyuseSuper
- Whether the call is to a super class propertyfromInsideClass
- ??
MetaClassImpl.getProperty(Class, Object, String, boolean, boolean)
public Object getProperty(Object object, String name)
getProperty
in interface MetaObjectProtocol
getProperty
in class MetaClassImpl
object
- An instance of the class returned by the getTheClass() methodname
- The name of the property to retrieve the value for
MetaClassImpl.getProperty(Object, String)
public void setProperty(Class sender, Object object, String name, Object newValue, boolean useSuper, boolean fromInsideClass)
setProperty
in interface MetaClass
setProperty
in class MetaClassImpl
sender
- The java.lang.Class instance that is mutating the propertyobject
- The Object which the property is being set onname
- The name of the propertynewValue
- The new value of the property to setuseSuper
- Whether the call is to a super class propertyfromInsideClass
- ??MetaClassImpl.setProperty(Class, Object, String, Object, boolean, boolean)
public MetaProperty getMetaProperty(String name)
getMetaProperty
in interface MetaObjectProtocol
getMetaProperty
in class MetaClassImpl
name
- The name of the MetaProperty
MetaObjectProtocol.getMetaProperty(String)
public boolean hasMetaProperty(String name)
name
- The name of the MetaProperty
public boolean hasMetaMethod(String name, Class[] args)
name
- The name of the MetaMethodargs
- The arguments to the meta method
public String getPropertyForSetter(String setterName)
setterName
- The setter name
public boolean isSetter(String name, CachedClass[] args)
public CallSite createPojoCallSite(CallSite site, Object receiver, Object[] args)
createPojoCallSite
in class MetaClassImpl
public CallSite createStaticSite(CallSite site, Object[] args)
createStaticSite
in class MetaClassImpl
public CallSite createPogoCallSite(CallSite site, Object[] args)
createPogoCallSite
in class MetaClassImpl
public CallSite createPogoCallCurrentSite(CallSite site, Class sender, String name, Object[] args)
public CallSite createConstructorSite(CallSite site, Object[] args)
createConstructorSite
in class MetaClassImpl
|
Copyright © 2003-2009 The Codehaus. All rights reserved. | ||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |