groovy.lang

## Interface MetaClass

- All Superinterfaces:
    MetaObjectProtocol
  All Known Subinterfaces:
    AdaptingMetaClass, MutableMetaClass
  All Known Implementing Classes:
    ClosureMetaClass, DelegatingMetaClass, ExpandoMetaClass, HandleMetaClass, MetaClassImpl, MixedInMetaClass, MockProxyMetaClass, OwnedMetaClass, ProxyMetaClass

      public interface MetaClass
      extends MetaObjectProtocol

  A MetaClass within Groovy defines the behaviour of any given Groovy or Java class. The MetaClass interface defines two parts. The client API, which is defined via the extend MetaObjectProtocol interface and the contract with the Groovy runtime system. In general the compiler and Groovy runtime engine interact with methods on this class whilst MetaClass clients interact with the method defined by the MetaObjectProtocol interface
  Author:
    John Wilson, Graeme Rocher
  See Also:
    `MetaClassImpl`, `MetaObjectProtocol`

- - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `Object` | `getAttribute(Class sender, Object receiver, String messageName, boolean useSuper)` Retrieves the value of an attribute (field).
    `ClassNode` | `getClassNode()` Obtains a reference to the original AST for the MetaClass if it is available at runtime
    `List<MetaMethod>` | `getMetaMethods()` Retrieves a list of MetaMethods held by this class
    `List<MetaMethod>` | `getMethods()` Retrieves a list of MetaMethods held by the class
    `List<MetaProperty>` | `getProperties()` Retrieves a list of MetaProperty instances that the MetaClass has
    `Object` | `getProperty(Class sender, Object receiver, String property, boolean isCallToSuper, boolean fromInsideClass)` Retrieves a property on the given receiver for the specified arguments.
    `void` | `initialize()` complete the initialisation process.
    `Object` | `invokeMethod(Class sender, Object receiver, String methodName, Object[] arguments, boolean isCallToSuper, boolean fromInsideClass)` Invokes a method on the given receiver for the specified arguments.
    `Object` | `invokeMissingMethod(Object instance, String methodName, Object[] arguments)` Attempts to invoke the methodMissing method otherwise throws a MissingMethodException
    `Object` | `invokeMissingProperty(Object instance, String propertyName, Object optionalValue, boolean isGetter)` Invokes the propertyMissing method otherwise throws a MissingPropertyException
    `MetaMethod` | `pickMethod(String methodName, Class[] arguments)` Selects a method by name and argument classes.
    `int` | `selectConstructorAndTransformArguments(int numberOfConstructors, Object[] arguments)` Internal method to support Groovy runtime.
    `void` | `setAttribute(Class sender, Object receiver, String messageName, Object messageValue, boolean useSuper, boolean fromInsideClass)` Sets the value of an attribute (field).
    `void` | `setProperty(Class sender, Object receiver, String property, Object value, boolean isCallToSuper, boolean fromInsideClass)` Retrieves a property on the given receiver for the specified arguments.

    - ### Methods inherited from interface groovy.lang.MetaObjectProtocol

      `getAttribute, getMetaMethod, getMetaProperty, getProperty, getStaticMetaMethod, getTheClass, hasProperty, invokeConstructor, invokeMethod, invokeMethod, invokeStaticMethod, respondsTo, respondsTo, setAttribute, setProperty`

- - ### Method Detail

    - #### invokeMethod

          Object invokeMethod(Class sender,
                            Object receiver,
                            String methodName,
                            Object[] arguments,
                            boolean isCallToSuper,
                            boolean fromInsideClass)

      Invokes a method on the given receiver for the specified arguments. The sender is the class that invoked the method on the object. The MetaClass will attempt to establish the method to invoke based on the name and arguments provided.

      The isCallToSuper and fromInsideClass help the Groovy runtime perform optimisations on the call to go directly to the super class if necessary

      Parameters:
        `sender` - The java.lang.Class instance that invoked the method
        `receiver` - The object which the method was invoked on
        `methodName` - The name of the method
        `arguments` - The arguments to the method
        `isCallToSuper` - Whether the method is a call to a super class method
        `fromInsideClass` - Whether the call was invoked from the inside or the outside of the class
      Returns:
        The return value of the method

    - #### getProperty

          Object getProperty(Class sender,
                           Object receiver,
                           String property,
                           boolean isCallToSuper,
                           boolean fromInsideClass)

      Retrieves a property on the given receiver for the specified arguments. The sender is the class that is requesting the property from the object. The MetaClass will attempt to establish the method to invoke based on the name and arguments provided.

      The isCallToSuper and fromInsideClass help the Groovy runtime perform optimisations on the call to go directly to the super class if necessary

      Parameters:
        `sender` - The java.lang.Class instance that requested the property
        `receiver` - The Object which the property is being retrieved from
        `property` - The name of the property
        `isCallToSuper` - Whether the call is to a super class property
        `fromInsideClass` - ??
      Returns:
        The properties value

    - #### setProperty

          void setProperty(Class sender,
                         Object receiver,
                         String property,
                         Object value,
                         boolean isCallToSuper,
                         boolean fromInsideClass)

      Retrieves a property on the given receiver for the specified arguments. The sender is the class that is requesting the property from the object. The MetaClass will attempt to establish the method to invoke based on the name and arguments provided.

      The isCallToSuper and fromInsideClass help the Groovy runtime perform optimisations on the call to go directly to the super class if necessary

      Parameters:
        `sender` - The java.lang.Class instance that is mutating the property
        `receiver` - The Object which the property is being set on
        `property` - The name of the property
        `value` - The new value of the property to set
        `isCallToSuper` - Whether the call is to a super class property
        `fromInsideClass` - ??

    - #### invokeMissingMethod

          Object invokeMissingMethod(Object instance,
                                   String methodName,
                                   Object[] arguments)

      Attempts to invoke the methodMissing method otherwise throws a MissingMethodException

      Parameters:
        `instance` - The instance to invoke methodMissing on
        `methodName` - The name of the method
        `arguments` - The arguments to the method
      Returns:
        The results of methodMissing or throws MissingMethodException
      See Also:
        `MissingMethodException`

    - #### invokeMissingProperty

          Object invokeMissingProperty(Object instance,
                                     String propertyName,
                                     Object optionalValue,
                                     boolean isGetter)

      Invokes the propertyMissing method otherwise throws a MissingPropertyException
      Parameters:
        `instance` - The instance of the class
        `propertyName` - The name of the property
        `optionalValue` - The value of the property which could be null in the case of a getter
        `isGetter` - Whether the missing property event was the result of a getter or a setter
      Returns:
        The result of the propertyMissing method or throws MissingPropertyException

    - #### getAttribute

          Object getAttribute(Class sender,
                            Object receiver,
                            String messageName,
                            boolean useSuper)

      Retrieves the value of an attribute (field). This method is to support the Groovy runtime and not for general client API usage.
      Parameters:
        `sender` - The class of the object that requested the attribute
        `receiver` - The instance
        `messageName` - The name of the attribute
        `useSuper` - Whether to look-up on the super class or not
      Returns:
        The attribute value

    - #### setAttribute

          void setAttribute(Class sender,
                          Object receiver,
                          String messageName,
                          Object messageValue,
                          boolean useSuper,
                          boolean fromInsideClass)

      Sets the value of an attribute (field). This method is to support the Groovy runtime and not for general client API usage.
      Parameters:
        `sender` - The class of the object that requested the attribute
        `receiver` - The instance
        `messageName` - The name of the attribute
        `messageValue` - The value of the attribute
        `useSuper` - Whether to look-up on the super class or not
        `fromInsideClass` - Whether the call happened from the inside or the outside of a class

    - #### initialize

          void initialize()

      complete the initialisation process. After this method is called no methods should be added to the meta class. Invocation of methods or access to fields/properties is forbidden unless this method is called. This method should contain any initialisation code, taking a longer time to complete. An example is the creation of the Reflector. It is suggested to synchronize this method.

    - #### getProperties

          List<MetaProperty> getProperties()

      Retrieves a list of MetaProperty instances that the MetaClass has
      Specified by:
        `getProperties` in interface `MetaObjectProtocol`
      Returns:
        A list of MetaProperty instances
      See Also:
        `MetaProperty`

    - #### getMethods

          List<MetaMethod> getMethods()

      Retrieves a list of MetaMethods held by the class
      Specified by:
        `getMethods` in interface `MetaObjectProtocol`
      Returns:
        A list of MetaMethods
      See Also:
        `MetaMethod`

    - #### getClassNode

          ClassNode getClassNode()

      Obtains a reference to the original AST for the MetaClass if it is available at runtime
      Returns:
        The original AST or null if it cannot be returned

    - #### getMetaMethods

          List<MetaMethod> getMetaMethods()

      Retrieves a list of MetaMethods held by this class
      Returns:
        A list of MetaMethods

    - #### selectConstructorAndTransformArguments

          int selectConstructorAndTransformArguments(int numberOfConstructors,
                                                   Object[] arguments)

      Internal method to support Groovy runtime. Not for client usage.
      Parameters:
        `numberOfConstructors` - The number of constructors
        `arguments` - The arguments
      Returns:
        selected index

    - #### pickMethod

          MetaMethod pickMethod(String methodName,
                              Class[] arguments)

      Selects a method by name and argument classes. This method does not search for an exact match, it searches for a compatible method. For this the method selection mechanism is used as provided by the implementation of this MetaClass. pickMethod may or may not be used during the method selection process when invoking a method. There is no warranty for that.
      Parameters:
        `methodName` - the name of the method to pick
        `arguments` - the method arguments
      Returns:
        a matching MetaMethod or null
      Throws:
        `GroovyRuntimeException` - if there is more than one matching method