mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			138 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* 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;
 | |
| 
 | |
| }
 |