/* java.lang.reflect.InvocationHandler - dynamically executes methods in
   proxy instances
   Copyright (C) 2001 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.lang.reflect;

/**
 * This interface defines an invocation handler.  Suppose you are using
 * reflection, and found a method that requires that its parameter
 * be an object of a given interface.  You want to call this method,
 * but have no idea what classes implement that interface.  So, you can
 * create a {@link Proxy} instance, a convenient way to dynamically
 * generate a class that meets all the necessary properties of that
 * interface.  But in order for the proxy instance to do any good, it
 * needs to know what to do when interface methods are invoked!  So,
 * this interface is basically a cool wrapper that provides runtime
 * code generation needed by proxy instances.
 *
 * <p>While this interface was designed for use by Proxy, it will also
 * work on any object in general.</p>
 *
 * <p>Hints for implementing this class:</p>
 *
 * <ul>
 * <li>Don't forget that Object.equals, Object.hashCode, and
 *     Object.toString will call this handler.  In particular,
 *     a naive call to proxy.equals, proxy.hashCode, or proxy.toString
 *     will put you in an infinite loop.  And remember that string
 *     concatenation also invokes toString.</li>
 * <li>Obey the contract of the Method object you are handling, or
 *     the proxy instance will be forced to throw a
 *     {@link NullPointerException}, {@link ClassCastException},
 *     or {@link UndeclaredThrowableException}.</li>
 * <li>Be prepared to wrap/unwrap primitives as necessary.</li>
 * <li>The Method object may be owned by a different interface than
 *     what was actually used as the qualifying type of the method
 *     invocation in the Java source code. This means that it might
 *     not always be safe to throw an exception listed as belonging
 *     to the method's throws clause.</li>
 * </ul>
 *
 * <p><small>For a fun time, create an InvocationHandler that handles the
 * methods of a proxy instance of the InvocationHandler interface!</small></p>
 *
 * @see Proxy
 * @see UndeclaredThrowableException
 *
 * @author Eric Blake (ebb9@email.byu.edu)
 * @since 1.3
 * @status updated to 1.4
 */
public interface InvocationHandler
{
  /**
   * When a method is invoked on a proxy instance, it is wrapped and
   * this method is called instead, so that you may decide at runtime
   * how the original method should behave.
   *
   * @param proxy the instance that the wrapped method should be
   *        invoked on.  When this method is called by a Proxy object,
   *        `proxy' will be an instance of {@link Proxy}, and oddly enough,
   *        <code>Proxy.getInvocationHandler(proxy)</code> will return
   *        <code>this</code>!
   * @param method the reflected method to invoke on the proxy.
   *        When this method is called by a Proxy object, 'method'
   *        will be the reflection object owned by the declaring
   *        class or interface, which may be a supertype of the
   *        interfaces the proxy directly implements.
   * @param args the arguments passed to the original method, or
   *        <code>null</code> if the method takes no arguments.
   *        (But also be prepared to handle a 0-length array).
   *        Arguments of primitive type, such as <code>boolean</code>
   *        or <code>int</code>, are wrapped in the appropriate
   *        class such as {@link Boolean} or {@link Integer}.
   * @return whatever is necessary to return from the wrapped method.
   *         If the wrapped method is <code>void</code>, the proxy
   *         instance will ignore it.  If the wrapped method returns
   *         a primitive, this must be the correct wrapper type whose value
   *         is exactly assignable to the appropriate type (no widening
   *         will be performed); a null object in this case causes a
   *         {@link NullPointerException}.  In all remaining cases, if
   *         the returned object is not assignment compatible to the
   *         declared type of the original method, the proxy instance
   *         will generate a {@link ClassCastException}.
   * @throws Throwable this interface is listed as throwing anything,
   *         but the implementation should only throw unchecked
   *         exceptions and exceptions listed in the throws clause of
   *         all methods being overridden by the proxy instance.  If
   *         something is thrown that is not compatible with the throws
   *         clause of all overridden methods, the proxy instance will
   *         wrap the exception in an UndeclaredThrowableException.
   *         Note that an exception listed in the throws clause of the
   *         `method' parameter might not be declared in additional
   *         interfaces also implemented by the proxy object.
   *
   * @see Proxy
   * @see UndeclaredThrowableException
   */
  Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable;

}
