/* 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;

}
