|
Groovy 1.7.0 | |||||||
FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectgroovy.lang.MetaClassImpl
groovy.lang.ExpandoMetaClass
class ExpandoMetaClass extends MetaClassImpl
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 | |
---|---|
interface |
ExpandoMetaClass.Callable
For simulating closures in Java |
class |
ExpandoMetaClass.DefiningClosure
|
class |
ExpandoMetaClass.ExpandoMetaConstructor
Handles the ability to use the left shift operator to append new constructors |
class |
ExpandoMetaClass.ExpandoMetaProperty
Instances of this class are returned when using the << left shift operator. |
class |
ExpandoMetaClass.MixedInAccessor
|
class |
ExpandoMetaClass.StaticDefiningClosure
|
class |
ExpandoMetaClass.SubClassDefiningClosure
|
Field Summary | |
---|---|
static String |
CONSTRUCTOR
|
static String |
STATIC_QUALIFIER
|
boolean |
inRegistry
|
Constructor Summary | |
ExpandoMetaClass(Class theClass)
Constructs a new ExpandoMetaClass instance for the given class |
|
ExpandoMetaClass(Class theClass, MetaMethod[] add)
|
|
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, MetaMethod[] add)
|
|
ExpandoMetaClass(Class theClass, boolean register, boolean allowChangesAfterInit)
Constructs a new ExpandoMetaClass instance for the given class optionally placing the MetaClass in the MetaClassRegistry automatically |
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
|
getExpandoMethods()
Returns a list of expando MetaMethod instances added to this ExpandoMetaClass |
Collection
|
getExpandoProperties()
Returns a list of MetaBeanProperty instances added to this ExpandoMetaClass |
Collection
|
getExpandoSubclassMethods()
|
Class
|
getJavaClass()
|
MetaClass
|
getMetaClass()
|
MetaProperty
|
getMetaProperty(String name)
Looks up an existing MetaProperty by name |
List
|
getMethods()
Overrides the behavior of parent getMethods() method to make MetaClass aware of added Expando methods |
List
|
getProperties()
|
Object
|
getProperty(String property)
|
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 |
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()
|
Object
|
invokeConstructor(Object[] arguments)
|
Object
|
invokeMethod(String name, Object args)
|
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
|
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()
|
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(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(String name, Class klazz, Closure closure)
|
void
|
registerSubclassInstanceMethod(MetaMethod metaMethod)
|
protected void
|
setInitialized(boolean b)
|
void
|
setMetaClass(MetaClass metaClass)
|
void
|
setProperty(String property, Object newValue)
|
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 |
Methods inherited from class MetaClassImpl | |
---|---|
getMetaMethod, getMetaProperty, getStaticMetaMethod, getSuperClasses, getTheCachedClass, getTheClass, hasProperty, isGroovyObject, respondsTo, respondsTo |
Methods inherited from class Object | |
---|---|
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll |
Field Detail |
---|
static final String CONSTRUCTOR
static final String STATIC_QUALIFIER
boolean inRegistry
Constructor Detail |
---|
public ExpandoMetaClass(Class theClass)
public ExpandoMetaClass(Class theClass, MetaMethod[] add)
public ExpandoMetaClass(Class theClass, boolean register)
public ExpandoMetaClass(Class theClass, boolean register, MetaMethod[] add)
public ExpandoMetaClass(Class theClass, boolean register, boolean allowChangesAfterInit)
Method Detail |
---|
public void addMixinClass(MixinInMetaClass mixin)
public Object castToMixedType(Object obj, Class type)
public CallSite createConstructorSite(CallSite site, Object[] args)
public CallSite createPogoCallCurrentSite(CallSite site, Class sender, String name, Object[] args)
public CallSite createPogoCallSite(CallSite site, Object[] args)
public CallSite createPojoCallSite(CallSite site, Object receiver, Object[] args)
public CallSite createStaticSite(CallSite site, Object[] args)
public ExpandoMetaClass define(Closure closure)
public static void disableGlobally()
public static void enableGlobally()
public MetaMethod findMixinMethod(String methodName, Class[] arguments)
public List getExpandoMethods()
public Collection getExpandoProperties()
public Collection getExpandoSubclassMethods()
public Class getJavaClass()
public MetaClass getMetaClass()
public MetaProperty getMetaProperty(String name)
public List getMethods()
public List getProperties()
public Object getProperty(String property)
public Object getProperty(Class sender, Object object, String name, boolean useSuper, boolean fromInsideClass)
public Object getProperty(Object object, String name)
public String getPropertyForSetter(String setterName)
protected Object getSubclassMetaMethods(String methodName)
public boolean hasMetaMethod(String name, Class[] args)
public boolean hasMetaProperty(String name)
public void initialize()
public Object invokeConstructor(Object[] arguments)
public Object invokeMethod(String name, Object args)
public Object invokeMethod(Class sender, Object object, String methodName, Object[] originalArguments, boolean isCallToSuper, boolean fromInsideClass)
public Object invokeStaticMethod(Object object, String methodName, Object[] arguments)
protected boolean isInitialized()
public boolean isModified()
public boolean isSetter(String name, CachedClass[] args)
public 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(Callable c)
public void refreshInheritedMethods(Set modifiedSuperExpandos)
public void registerBeanProperty(String property, Object newValue)
public void registerInstanceMethod(MetaMethod metaMethod)
public void registerInstanceMethod(String name, Closure closure)
protected void registerStaticMethod(String name, Closure callable)
protected void registerStaticMethod(String name, Closure callable, Class[] paramTypes)
public void registerSubclassInstanceMethod(String name, Class klazz, Closure closure)
public void registerSubclassInstanceMethod(MetaMethod metaMethod)
protected void setInitialized(boolean b)
public void setMetaClass(MetaClass metaClass)
public void setProperty(String property, Object newValue)
public void setProperty(Class sender, Object object, String name, Object newValue, boolean useSuper, boolean fromInsideClass)
Copyright © 2003-2009 The Codehaus. All rights reserved.