AbstractInvocationHandler
Date: 2016-05-24

com.google.common.reflect

## Class AbstractInvocationHandler

- java.lang.Object
- - com.google.common.reflect.AbstractInvocationHandler

- All Implemented Interfaces:
    java.lang.reflect.InvocationHandler

      @Beta
      public abstract class AbstractInvocationHandler
      extends java.lang.Object
      implements java.lang.reflect.InvocationHandler

  Abstract implementation of `InvocationHandler` that handles `Object.equals(java.lang.Object)`, `Object.hashCode()` and `Object.toString()`. For example:

       class Unsupported extends AbstractInvocationHandler {
         protected Object handleInvocation(
             Object proxy, Method method, Object[] args) {
           throw new UnsupportedOperationException();
         }
       }

       CharSequence unsupported = Reflection.newProxy(CharSequence.class, new Unsupported());

  Since:
    12.0

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `AbstractInvocationHandler()`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `equals(java.lang.Object obj)` By default delegates to `Object.equals(java.lang.Object)` so instances are only equal if they are identical.
    `protected abstract java.lang.Object` | `handleInvocation(java.lang.Object proxy, java.lang.reflect.Method method, java.lang.Object[] args)` `invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])` delegates to this method upon any method invocation on the proxy instance, except `Object.equals(java.lang.Object)`, `Object.hashCode()` and `Object.toString()`.
    `int` | `hashCode()` By default delegates to `Object.hashCode()`.
    `java.lang.Object` | `invoke(java.lang.Object proxy, java.lang.reflect.Method method, java.lang.Object[] args)`
    `java.lang.String` | `toString()` By default delegates to `Object.toString()`.

    - ### Methods inherited from class java.lang.Object

      `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### AbstractInvocationHandler

          public AbstractInvocationHandler()

  - ### Method Detail

    - #### invoke

          public final java.lang.Object invoke(java.lang.Object proxy,
                                java.lang.reflect.Method method,
                                @Nullable
                                java.lang.Object[] args)
                                        throws java.lang.Throwable

      - `proxy.hashCode()` delegates to `hashCode()`
      - `proxy.toString()` delegates to `toString()`
      - `proxy.equals(argument)` returns true if:
        - `proxy` and `argument` are of the same type
        - and `equals(java.lang.Object)` returns true for the `InvocationHandler` of `argument`
      - other method calls are dispatched to `handleInvocation(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])`.
      Specified by:
        `invoke` in interface `java.lang.reflect.InvocationHandler`
      Throws:
        `java.lang.Throwable`

    - #### handleInvocation

          protected abstract java.lang.Object handleInvocation(java.lang.Object proxy,
                                          java.lang.reflect.Method method,
                                          java.lang.Object[] args)
                                                        throws java.lang.Throwable

      `invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])` delegates to this method upon any method invocation on the proxy instance, except `Object.equals(java.lang.Object)`, `Object.hashCode()` and `Object.toString()`. The result will be returned as the proxied method's return value.

      Unlike `invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])`, `args` will never be null. When the method has no parameter, an empty array is passed in.

      Throws:
        `java.lang.Throwable`

    - #### equals

          public boolean equals(java.lang.Object obj)

      By default delegates to `Object.equals(java.lang.Object)` so instances are only equal if they are identical. `proxy.equals(argument)` returns true if:
      - `proxy` and `argument` are of the same type
      - and this method returns true for the `InvocationHandler` of `argument`

      Subclasses can override this method to provide custom equality.

      Overrides:
        `equals` in class `java.lang.Object`

    - #### hashCode

          public int hashCode()

      By default delegates to `Object.hashCode()`. The dynamic proxies' `hashCode()` will delegate to this method. Subclasses can override this method to provide custom equality.
      Overrides:
        `hashCode` in class `java.lang.Object`

    - #### toString

          public java.lang.String toString()

      By default delegates to `Object.toString()`. The dynamic proxies' `toString()` will delegate to this method. Subclasses can override this method to provide custom string representation for the proxies.
      Overrides:
        `toString` in class `java.lang.Object`