Package groovy.lang

Class ProxyMetaClass

  • All Implemented Interfaces:
    AdaptingMetaClass, MetaClass, MetaObjectProtocol, MutableMetaClass
    Direct Known Subclasses:
    MockProxyMetaClass

    public class ProxyMetaClass
    extends MetaClassImpl
    implements AdaptingMetaClass
    As subclass of MetaClass, ProxyMetaClass manages calls from Groovy Objects to POJOs. It enriches MetaClass with the feature of making method invocations interceptable by an Interceptor. To this end, it acts as a decorator (decorator pattern) allowing to add or withdraw this feature at runtime. See groovy/lang/InterceptorTest.groovy for details.

    WARNING: This implementation of ProxyMetaClass is NOT thread-safe and hence should only be used for as a per-instance MetaClass running in a single thread. Do not place this MetaClass in the MetaClassRegistry as it will result in unpredictable behaviour

    See Also:
    MetaClassRegistry
    • Constructor Detail

      • ProxyMetaClass

        public ProxyMetaClass​(MetaClassRegistry registry,
                              java.lang.Class theClass,
                              MetaClass adaptee)
        Parameters:
        adaptee - the MetaClass to decorate with interceptability
    • Method Detail

      • getInstance

        public static ProxyMetaClass getInstance​(java.lang.Class theClass)
        convenience factory method for the most usual case.
      • initialize

        public void initialize()
        Description copied from class: MetaClassImpl
        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.
        Specified by:
        initialize in interface MetaClass
        Overrides:
        initialize in class MetaClassImpl
      • use

        public java.lang.Object use​(Closure closure)
        Use the ProxyMetaClass for the given Closure. Cares for balanced register/unregister.
        Parameters:
        closure - piece of code to be executed with registered ProxyMetaClass
      • use

        public java.lang.Object use​(GroovyObject object,
                                    Closure closure)
        Use the ProxyMetaClass for the given Closure. Cares for balanced setting/unsetting ProxyMetaClass.
        Parameters:
        closure - piece of code to be executed with ProxyMetaClass
      • getInterceptor

        public Interceptor getInterceptor()
        Returns:
        the interceptor in use or null if no interceptor is used
      • setInterceptor

        public void setInterceptor​(Interceptor interceptor)
        Parameters:
        interceptor - may be null to reset any interception
      • invokeMethod

        public java.lang.Object invokeMethod​(java.lang.Object object,
                                             java.lang.String methodName,
                                             java.lang.Object[] arguments)
        Call invokeMethod on adaptee with logic like in MetaClass unless we have an Interceptor. With Interceptor the call is nested in its beforeInvoke and afterInvoke methods. The method call is suppressed if Interceptor.doInvoke() returns false. See Interceptor for details.
        Specified by:
        invokeMethod in interface MetaObjectProtocol
        Overrides:
        invokeMethod in class MetaClassImpl
        Parameters:
        object - The object which the method was invoked on
        methodName - The name of the method
        arguments - The arguments to the method
        Returns:
        The return value of the method
        See Also:
        MetaClass.invokeMethod(Class, Object, String, Object[], boolean, boolean)
      • invokeMethod

        public java.lang.Object invokeMethod​(java.lang.Class sender,
                                             java.lang.Object object,
                                             java.lang.String methodName,
                                             java.lang.Object[] arguments,
                                             boolean isCallToSuper,
                                             boolean fromInsideClass)
        Call invokeMethod on adaptee with logic like in MetaClass unless we have an Interceptor. With Interceptor the call is nested in its beforeInvoke and afterInvoke methods. The method call is suppressed if Interceptor.doInvoke() returns false. See Interceptor for details.
        Specified by:
        invokeMethod in interface MetaClass
        Overrides:
        invokeMethod in class MetaClassImpl
        Parameters:
        sender - The java.lang.Class instance that invoked the method
        object - 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
        See Also:
        MetaClass.invokeMethod(Class, Object, String, Object[], boolean, boolean)
      • invokeStaticMethod

        public java.lang.Object invokeStaticMethod​(java.lang.Object object,
                                                   java.lang.String methodName,
                                                   java.lang.Object[] arguments)
        Call invokeStaticMethod on adaptee with logic like in MetaClass unless we have an Interceptor. With Interceptor the call is nested in its beforeInvoke and afterInvoke methods. The method call is suppressed if Interceptor.doInvoke() returns false. See Interceptor for details.
        Specified by:
        invokeStaticMethod in interface MetaObjectProtocol
        Overrides:
        invokeStaticMethod in class MetaClassImpl
        Parameters:
        object - An instance of the class returned by the getTheClass() method or the class itself
        methodName - The name of the method
        arguments - The arguments to the method
        Returns:
        The return value of the method which is null if the return type is void
        See Also:
        MissingMethodException
      • invokeConstructor

        public java.lang.Object invokeConstructor​(java.lang.Object[] arguments)
        Call invokeConstructor on adaptee with logic like in MetaClass unless we have an Interceptor. With Interceptor the call is nested in its beforeInvoke and afterInvoke methods. The method call is suppressed if Interceptor.doInvoke() returns false. See Interceptor for details.
        Specified by:
        invokeConstructor in interface MetaObjectProtocol
        Overrides:
        invokeConstructor in class MetaClassImpl
        Parameters:
        arguments - The arguments to the constructor
        Returns:
        An instance of the java.lang.Class that this MetaObjectProtocol object applies to
      • getProperty

        public java.lang.Object getProperty​(java.lang.Class aClass,
                                            java.lang.Object object,
                                            java.lang.String property,
                                            boolean b,
                                            boolean b1)
        Interceptors the call to getProperty if a PropertyAccessInterceptor is available
        Specified by:
        getProperty in interface MetaClass
        Overrides:
        getProperty in class MetaClassImpl
        Parameters:
        object - the object to invoke the getter on
        property - the property name
        aClass - The java.lang.Class instance that requested the property
        b - Whether the call is to a super class property
        b1 - ??
        Returns:
        the value of the property
      • setProperty

        public void setProperty​(java.lang.Class aClass,
                                java.lang.Object object,
                                java.lang.String property,
                                java.lang.Object newValue,
                                boolean b,
                                boolean b1)
        Interceptors the call to a property setter if a PropertyAccessInterceptor is available
        Specified by:
        setProperty in interface MetaClass
        Overrides:
        setProperty in class MetaClassImpl
        Parameters:
        object - The object to invoke the setter on
        property - The property name to set
        newValue - The new value of the property
        aClass - The java.lang.Class instance that is mutating the property
        b - Whether the call is to a super class property
        b1 - Whether the call was invoked from the inside or the outside of the class.
      • setAdaptee

        public void setAdaptee​(MetaClass metaClass)
        Description copied from interface: AdaptingMetaClass
        Sets the MetaClass adapted by this MetaClass
        Specified by:
        setAdaptee in interface AdaptingMetaClass
        Parameters:
        metaClass - The MetaClass to adapt