Class ConversionHandler

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.reflect.InvocationHandler
    Direct Known Subclasses:
    ConvertedClosure, ConvertedMap

    public abstract class ConversionHandler
    extends java.lang.Object
    implements java.lang.reflect.InvocationHandler, java.io.Serializable
    This class is a general adapter to map a call to a Java interface to a given delegate.
    See Also:
    Serialized Form
    • Constructor Summary

      Constructors 
      Constructor Description
      ConversionHandler​(java.lang.Object delegate)
      Creates a ConversionHandler with an delegate.
    • Method Summary

      All Methods Static Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      protected boolean checkMethod​(java.lang.reflect.Method method)  
      boolean equals​(java.lang.Object obj)
      Indicates whether some other object is "equal to" this one.
      java.lang.Object getDelegate()
      Returns the delegate.
      int hashCode()
      Returns a hash code value for the delegate.
      java.lang.Object invoke​(java.lang.Object proxy, java.lang.reflect.Method method, java.lang.Object[] args)
      This method is a default implementation for the invoke method given in InvocationHandler.
      abstract java.lang.Object invokeCustom​(java.lang.Object proxy, java.lang.reflect.Method method, java.lang.Object[] args)
      This method is called for all Methods not defined on Object.
      static boolean isCoreObjectMethod​(java.lang.reflect.Method method)
      Checks whether a method is a core method from java.lang.Object.
      protected boolean isDefaultMethod​(java.lang.reflect.Method method)  
      java.lang.String toString()
      Returns a String version of the delegate.
      • Methods inherited from class java.lang.Object

        clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    • Constructor Detail

      • ConversionHandler

        public ConversionHandler​(java.lang.Object delegate)
        Creates a ConversionHandler with an delegate.
        Parameters:
        delegate - the delegate
        Throws:
        java.lang.IllegalArgumentException - if the given delegate is null
    • Method Detail

      • getDelegate

        public java.lang.Object getDelegate()
        Returns the delegate.
        Returns:
        the delegate
      • invoke

        public java.lang.Object invoke​(java.lang.Object proxy,
                                       java.lang.reflect.Method method,
                                       java.lang.Object[] args)
                                throws java.lang.Throwable
        This method is a default implementation for the invoke method given in InvocationHandler. Any call to a method with a declaring class that is not Object, excluding toString() and default methods is redirected to invokeCustom.

        Methods like equals and hashcode are called on the class itself instead of the delegate because they are considered fundamental methods that should not be overwritten. The toString() method gets special treatment as it is deemed to be a method that you might wish to override when called from Groovy. Interface default methods from Java 8 on the other hand are considered being default implementations you don't normally want to change. So they are called directly too

        In many scenarios, it is better to overwrite the invokeCustom method where the core Object related methods are filtered out.

        Specified by:
        invoke in interface java.lang.reflect.InvocationHandler
        Parameters:
        proxy - the proxy
        method - the method
        args - the arguments
        Returns:
        the result of the invocation by method or delegate
        Throws:
        java.lang.Throwable - if caused by the delegate or the method
        See Also:
        invokeCustom(Object, Method, Object[]), InvocationHandler.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
      • isDefaultMethod

        protected boolean isDefaultMethod​(java.lang.reflect.Method method)
      • checkMethod

        protected boolean checkMethod​(java.lang.reflect.Method method)
      • invokeCustom

        public abstract java.lang.Object invokeCustom​(java.lang.Object proxy,
                                                      java.lang.reflect.Method method,
                                                      java.lang.Object[] args)
                                               throws java.lang.Throwable
        This method is called for all Methods not defined on Object. The delegate should be called here.
        Parameters:
        proxy - the proxy
        method - the method
        args - the arguments
        Returns:
        the result of the invocation of the delegate
        Throws:
        java.lang.Throwable - any exception causes by the delegate
        See Also:
        invoke(Object, Method, Object[]), InvocationHandler.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
      • equals

        public boolean equals​(java.lang.Object obj)
        Indicates whether some other object is "equal to" this one. The delegate is used if the class of the parameter and the current class are equal. In other cases the method will return false. The exact class is here used, if inheritance is needed, this method must be overwritten.
        Overrides:
        equals in class java.lang.Object
        See Also:
        Object.equals(java.lang.Object)
      • hashCode

        public int hashCode()
        Returns a hash code value for the delegate.
        Overrides:
        hashCode in class java.lang.Object
        See Also:
        Object.hashCode()
      • toString

        public java.lang.String toString()
        Returns a String version of the delegate.
        Overrides:
        toString in class java.lang.Object
        See Also:
        Object.toString()
      • isCoreObjectMethod

        public static boolean isCoreObjectMethod​(java.lang.reflect.Method method)
        Checks whether a method is a core method from java.lang.Object. Such methods often receive special treatment because they are deemed fundamental enough to not be tampered with.
        Parameters:
        method - the method to check
        Returns:
        true if the method is deemed to be a core method