diff options
author | Andrew Haley <aph@redhat.com> | 2016-09-30 16:24:48 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2016-09-30 16:24:48 +0000 |
commit | 07b78716af6a9d7c9fd1e94d9baf94a52c873947 (patch) | |
tree | 3f22b3241c513ad168c8353805614ae1249410f4 /libjava/classpath/java/lang/reflect | |
parent | eae993948bae8b788c53772bcb9217c063716f93 (diff) | |
download | gcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.zip gcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.tar.gz gcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.tar.bz2 |
Makefile.def: Remove libjava.
2016-09-30 Andrew Haley <aph@redhat.com>
* Makefile.def: Remove libjava.
* Makefile.tpl: Likewise.
* Makefile.in: Regenerate.
* configure.ac: Likewise.
* configure: Likewise.
* gcc/java: Remove.
* libjava: Likewise.
From-SVN: r240662
Diffstat (limited to 'libjava/classpath/java/lang/reflect')
24 files changed, 0 insertions, 5915 deletions
diff --git a/libjava/classpath/java/lang/reflect/AccessibleObject.java b/libjava/classpath/java/lang/reflect/AccessibleObject.java deleted file mode 100644 index 7567691..0000000 --- a/libjava/classpath/java/lang/reflect/AccessibleObject.java +++ /dev/null @@ -1,233 +0,0 @@ -/* java.lang.reflect.AccessibleObject - Copyright (C) 2001, 2005, 2006 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; - -import java.lang.annotation.Annotation; - -/** - * This class is the superclass of various reflection classes, and - * allows sufficiently trusted code to bypass normal restrictions to - * do necessary things like invoke private methods outside of the - * class during Serialization. If you don't have a good reason - * to mess with this, don't try. Fortunately, there are adequate - * security checks before you can set a reflection object as accessible. - * - * @author Tom Tromey (tromey@cygnus.com) - * @author Eric Blake (ebb9@email.byu.edu) - * @see Field - * @see Constructor - * @see Method - * @see ReflectPermission - * @since 1.2 - * @status updated to 1.5 - */ -public class AccessibleObject - implements AnnotatedElement -{ - /** - * True if this object is marked accessible, which means the reflected - * object bypasses normal security checks. - */ - // default visibility for use by inherited classes - boolean flag = false; - - /** - * Only the three reflection classes that extend this can create an - * accessible object. This is not serializable for security reasons. - */ - protected AccessibleObject() - { - } - - /** - * Return the accessibility status of this object. - * - * @return true if this object bypasses security checks - */ - public boolean isAccessible() - { - return flag; - } - - /** - * Convenience method to set the flag on a number of objects with a single - * security check. If a security manager exists, it is checked for - * <code>ReflectPermission("suppressAccessChecks")</code>.<p> - * - * It is forbidden to set the accessibility flag to true on any constructor - * for java.lang.Class. This will result in a SecurityException. If the - * SecurityException is thrown for any of the passed AccessibleObjects, - * the accessibility flag will be set on AccessibleObjects in the array prior - * to the one which resulted in the exception. - * - * @param array the array of accessible objects - * @param flag the desired state of accessibility, true to bypass security - * @throws NullPointerException if array is null - * @throws SecurityException if the request is denied - * @see SecurityManager#checkPermission(java.security.Permission) - * @see RuntimePermission - */ - public static void setAccessible(AccessibleObject[] array, boolean flag) - { - checkPermission(); - for (int i = 0; i < array.length; i++) - array[i].secureSetAccessible(flag); - } - - /** - * Sets the accessibility flag for this reflection object. If a security - * manager exists, it is checked for - * <code>ReflectPermission("suppressAccessChecks")</code>.<p> - * - * It is forbidden to set the accessibility flag to true on any constructor for - * java.lang.Class. This will result in a SecurityException. - * - * @param flag the desired state of accessibility, true to bypass security - * @throws NullPointerException if array is null - * @throws SecurityException if the request is denied - * @see SecurityManager#checkPermission(java.security.Permission) - * @see RuntimePermission - */ - public void setAccessible(boolean flag) - { - checkPermission(); - secureSetAccessible(flag); - } - - /** - * Performs the specified security check, for - * <code>ReflectPermission("suppressAccessChecks")</code>. - * - * @throws SecurityException if permission is denied - */ - private static void checkPermission() - { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new ReflectPermission("suppressAccessChecks")); - } - - /** - * Performs the actual accessibility change, this must always be invoked - * after calling checkPermission. - * - * @param flag the desired status - * @throws SecurityException if flag is true and this is a constructor - * for <code>java.lang.Class</code>. - */ - private void secureSetAccessible(boolean flag) - { - if (flag && - (this instanceof Constructor - && ((Constructor) this).getDeclaringClass() == Class.class)) - throw new SecurityException("Cannot make object accessible: " + this); - this.flag = flag; - } - - /** - * <p> - * Returns the element's annotation for the specified annotation type, - * or <code>null</code> if no such annotation exists. - * </p> - * <p> - * <strong>This method must be overridden by subclasses to provide - * appropriate behaviour.</strong> - * </p> - * - * @param annotationClass the type of annotation to look for. - * @return this element's annotation for the specified type, or - * <code>null</code> if no such annotation exists. - * @throws NullPointerException if the annotation class is <code>null</code>. - */ - public <T extends Annotation> T getAnnotation(Class<T> annotationClass) - { - throw new AssertionError("Subclass must override this method"); - } - - /** - * Returns all annotations associated with the element. If there are - * no annotations associated with the element, then a zero-length array - * will be returned. The returned array may be modified by the client - * code, but this will have no effect on the annotation content of the - * element, and hence no effect on the return value of this method for - * future callers. - * - * @return this element's annotations. - */ - public Annotation[] getAnnotations() - { - return getDeclaredAnnotations(); - } - - /** - * <p> - * Returns all annotations directly defined by the element. If there are - * no annotations directly associated with the element, then a zero-length - * array will be returned. The returned array may be modified by the client - * code, but this will have no effect on the annotation content of this - * class, and hence no effect on the return value of this method for - * future callers. - * </p> - * <p> - * <strong>This method must be overridden by subclasses to provide - * appropriate behaviour.</strong> - * </p> - * - * @return the annotations directly defined by the element. - * @since 1.5 - */ - public Annotation[] getDeclaredAnnotations() - { - throw new AssertionError("Subclass must override this method"); - } - - /** - * Returns true if an annotation for the specified type is associated - * with the element. This is primarily a short-hand for using marker - * annotations. - * - * @param annotationClass the type of annotation to look for. - * @return true if an annotation exists for the specified type. - * @since 1.5 - */ - public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) - { - return getAnnotation(annotationClass) != null; - } -} diff --git a/libjava/classpath/java/lang/reflect/AnnotatedElement.java b/libjava/classpath/java/lang/reflect/AnnotatedElement.java deleted file mode 100644 index 0179a0f..0000000 --- a/libjava/classpath/java/lang/reflect/AnnotatedElement.java +++ /dev/null @@ -1,115 +0,0 @@ -/* AnnotatedElement.java - Copyright (C) 2004, 2005 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; - -import java.lang.annotation.Annotation; - -/** - * <p> - * Represents an element that can be annotated. The methods of this interface - * provide reflection-based access to the annotations associated with a - * particular element, such as a class, field, method or package. Each - * annotation returned by these methods is both immutable and serializable. - * The returned arrays may be freely modified, without any effect on the - * arrays returned to future callers. - * </p> - * <p> - * If an annotation refers to a type or enumeration constant that is - * inaccessible, then a <code>TypeNotPresentException</code> or - * <code>EnumConstantNotPresentException</code> will be thrown. Likewise, - * invalid annotations will produce either a - * <code>AnnotationTypeMismatchException</code> or - * <code>IncompleteAnnotationException</code>. - * </p> - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public interface AnnotatedElement -{ - - /** - * Returns the element's annotation for the specified annotation type, - * or <code>null</code> if no such annotation exists. - * - * @param annotationClass the type of annotation to look for. - * @return this element's annotation for the specified type, or - * <code>null</code> if no such annotation exists. - * @throws NullPointerException if the annotation class is <code>null</code>. - */ - <T extends Annotation> T getAnnotation(Class<T> annotationClass); - - /** - * Returns all annotations associated with the element. If there are - * no annotations associated with the element, then a zero-length array - * will be returned. The returned array may be modified by the client - * code, but this will have no effect on the annotation content of the - * element, and hence no effect on the return value of this method for - * future callers. - * - * @return this element's annotations. - */ - Annotation[] getAnnotations(); - - /** - * Returns all annotations directly defined by the element. If there are - * no annotations directly associated with the element, then a zero-length - * array will be returned. The returned array may be modified by the client - * code, but this will have no effect on the annotation content of this - * class, and hence no effect on the return value of this method for - * future callers. - * - * @return the annotations directly defined by the element. - * @since 1.5 - */ - Annotation[] getDeclaredAnnotations(); - - /** - * Returns true if an annotation for the specified type is associated - * with the element. This is primarily a short-hand for using marker - * annotations. - * - * @param annotationClass the type of annotation to look for. - * @return true if an annotation exists for the specified type. - * @since 1.5 - */ - boolean isAnnotationPresent(Class<? extends Annotation> annotationClass); - -} diff --git a/libjava/classpath/java/lang/reflect/Array.java b/libjava/classpath/java/lang/reflect/Array.java deleted file mode 100644 index a31e48e..0000000 --- a/libjava/classpath/java/lang/reflect/Array.java +++ /dev/null @@ -1,655 +0,0 @@ -/* java.lang.reflect.Array - manipulate arrays by reflection - Copyright (C) 1998, 1999, 2001, 2003, 2005 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; - -/** - * Array holds static helper functions that allow you to create and - * manipulate arrays by reflection. Operations know how to perform widening - * conversions, but throw {@link IllegalArgumentException} if you attempt - * a narrowing conversion. Also, when accessing primitive arrays, this - * class performs object wrapping and unwrapping as necessary.<p> - * - * <B>Note:</B> This class returns and accepts types as Classes, even - * primitive types; there are Class types defined that represent each - * different primitive type. They are <code>java.lang.Boolean.TYPE, - * java.lang.Byte.TYPE,</code>, also available as <code>boolean.class, - * byte.class</code>, etc. These are not to be confused with the - * classes <code>java.lang.Boolean, java.lang.Byte</code>, etc., which are - * real classes. Note also that the shorthand <code>Object[].class</code> - * is a convenient way to get array Classes.<p> - * - * <B>Performance note:</B> This class performs best when it does not have - * to convert primitive types. The further along the chain it has to convert, - * the worse performance will be. You're best off using the array as whatever - * type it already is, and then converting the result. You will do even - * worse if you do this and use the generic set() function. - * - * @author John Keiser - * @author Eric Blake (ebb9@email.byu.edu) - * @author Per Bothner (bothner@cygnus.com) - * @see java.lang.Boolean#TYPE - * @see java.lang.Byte#TYPE - * @see java.lang.Short#TYPE - * @see java.lang.Character#TYPE - * @see java.lang.Integer#TYPE - * @see java.lang.Long#TYPE - * @see java.lang.Float#TYPE - * @see java.lang.Double#TYPE - * @since 1.1 - * @status updated to 1.4 - */ -public final class Array -{ - - /** - * This class is uninstantiable. - */ - private Array() - { - } - - /** - * Creates a new single-dimensioned array. - * @param componentType the type of the array to create - * @param length the length of the array to create - * @return the created array, cast to an Object - * @throws NullPointerException if <code>componentType</code> is null - * @throws IllegalArgumentException if <code>componentType</code> is - * <code>Void.TYPE</code> - * @throws NegativeArraySizeException when length is less than 0 - * @throws OutOfMemoryError if memory allocation fails - */ - public static Object newInstance(Class<?> componentType, int length) - { - if (! componentType.isPrimitive()) - return VMArray.createObjectArray(componentType, length); - if (componentType == boolean.class) - return new boolean[length]; - if (componentType == byte.class) - return new byte[length]; - if (componentType == char.class) - return new char[length]; - if (componentType == short.class) - return new short[length]; - if (componentType == int.class) - return new int[length]; - if (componentType == long.class) - return new long[length]; - if (componentType == float.class) - return new float[length]; - if (componentType == double.class) - return new double[length]; - // assert componentType == void.class - throw new IllegalArgumentException(); - } - - /** - * Creates a new multi-dimensioned array. The new array has the same - * component type as the argument class, and the number of dimensions - * in the new array is the sum of the dimensions of the argument class - * and the length of the argument dimensions. Virtual Machine limitations - * forbid too many dimensions (usually 255 is the maximum); but even - * 50 dimensions of 2 elements in each dimension would exceed your memory - * long beforehand! - * - * @param componentType the type of the array to create. - * @param dimensions the dimensions of the array to create. Each element - * in <code>dimensions</code> makes another dimension of the new - * array. Thus, <code>Array.newInstance(java.lang.Boolean, - * new int[]{1,2,3})</code> is the same as - * <code>new java.lang.Boolean[1][2][3]</code> - * @return the created array, cast to an Object - * @throws NullPointerException if componentType or dimension is null - * @throws IllegalArgumentException if the the size of - * <code>dimensions</code> is 0 or exceeds the maximum number of - * array dimensions in the VM; or if componentType is Void.TYPE - * @throws NegativeArraySizeException when any of the dimensions is less - * than 0 - * @throws OutOfMemoryError if memory allocation fails - */ - public static Object newInstance(Class<?> componentType, int[] dimensions) - { - if (dimensions.length <= 0) - throw new IllegalArgumentException ("Empty dimensions array."); - return createMultiArray(componentType, dimensions, 0); - } - - /** - * Gets the array length. - * @param array the array - * @return the length of the array - * @throws IllegalArgumentException if <code>array</code> is not an array - * @throws NullPointerException if <code>array</code> is null - */ - public static int getLength(Object array) - { - if (array instanceof Object[]) - return ((Object[]) array).length; - if (array instanceof boolean[]) - return ((boolean[]) array).length; - if (array instanceof byte[]) - return ((byte[]) array). length; - if (array instanceof char[]) - return ((char[]) array).length; - if (array instanceof short[]) - return ((short[]) array).length; - if (array instanceof int[]) - return ((int[]) array).length; - if (array instanceof long[]) - return ((long[]) array).length; - if (array instanceof float[]) - return ((float[]) array).length; - if (array instanceof double[]) - return ((double[]) array).length; - if (array == null) - throw new NullPointerException(); - throw new IllegalArgumentException(); - } - - /** - * Gets an element of an array. Primitive elements will be wrapped in - * the corresponding class type. - * - * @param array the array to access - * @param index the array index to access - * @return the element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not an array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #getBoolean(Object, int) - * @see #getByte(Object, int) - * @see #getChar(Object, int) - * @see #getShort(Object, int) - * @see #getInt(Object, int) - * @see #getLong(Object, int) - * @see #getFloat(Object, int) - * @see #getDouble(Object, int) - */ - public static Object get(Object array, int index) - { - if (array instanceof Object[]) - return ((Object[]) array)[index]; - if (array instanceof boolean[]) - return ((boolean[]) array)[index] ? Boolean.TRUE : Boolean.FALSE; - if (array instanceof byte[]) - return Byte.valueOf(((byte[]) array)[index]); - if (array instanceof char[]) - return Character.valueOf(((char[]) array)[index]); - if (array instanceof short[]) - return Short.valueOf(((short[]) array)[index]); - if (array instanceof int[]) - return Integer.valueOf(((int[]) array)[index]); - if (array instanceof long[]) - return Long.valueOf(((long[]) array)[index]); - if (array instanceof float[]) - return Float.valueOf(((float[]) array)[index]); - if (array instanceof double[]) - return Double.valueOf(((double[]) array)[index]); - if (array == null) - throw new NullPointerException(); - throw new IllegalArgumentException(); - } - - /** - * Gets an element of a boolean array. - * - * @param array the array to access - * @param index the array index to access - * @return the boolean element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a boolean - * array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static boolean getBoolean(Object array, int index) - { - if (array instanceof boolean[]) - return ((boolean[]) array)[index]; - if (array == null) - throw new NullPointerException(); - throw new IllegalArgumentException(); - } - - /** - * Gets an element of a byte array. - * - * @param array the array to access - * @param index the array index to access - * @return the byte element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a byte - * array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static byte getByte(Object array, int index) - { - if (array instanceof byte[]) - return ((byte[]) array)[index]; - if (array == null) - throw new NullPointerException(); - throw new IllegalArgumentException(); - } - - /** - * Gets an element of a char array. - * - * @param array the array to access - * @param index the array index to access - * @return the char element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a char - * array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static char getChar(Object array, int index) - { - if (array instanceof char[]) - return ((char[]) array)[index]; - if (array == null) - throw new NullPointerException(); - throw new IllegalArgumentException(); - } - - /** - * Gets an element of a short array. - * - * @param array the array to access - * @param index the array index to access - * @return the short element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a byte - * or char array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static short getShort(Object array, int index) - { - if (array instanceof short[]) - return ((short[]) array)[index]; - return getByte(array, index); - } - - /** - * Gets an element of an int array. - * - * @param array the array to access - * @param index the array index to access - * @return the int element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a byte, - * char, short, or int array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static int getInt(Object array, int index) - { - if (array instanceof int[]) - return ((int[]) array)[index]; - if (array instanceof char[]) - return ((char[]) array)[index]; - return getShort(array, index); - } - - /** - * Gets an element of a long array. - * - * @param array the array to access - * @param index the array index to access - * @return the long element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a byte, - * char, short, int, or long array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static long getLong(Object array, int index) - { - if (array instanceof long[]) - return ((long[]) array)[index]; - return getInt(array, index); - } - - /** - * Gets an element of a float array. - * - * @param array the array to access - * @param index the array index to access - * @return the float element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a byte, - * char, short, int, long, or float array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static float getFloat(Object array, int index) - { - if (array instanceof float[]) - return ((float[]) array)[index]; - return getLong(array, index); - } - - /** - * Gets an element of a double array. - * - * @param array the array to access - * @param index the array index to access - * @return the double element at <code>array[index]</code> - * @throws IllegalArgumentException if <code>array</code> is not a byte, - * char, short, int, long, float, or double array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #get(Object, int) - */ - public static double getDouble(Object array, int index) - { - if (array instanceof double[]) - return ((double[]) array)[index]; - return getFloat(array, index); - } - - /** - * Sets an element of an array. If the array is primitive, then the new - * value is unwrapped and widened. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not an array, - * or the array is primitive and unwrapping value fails, or the - * value is not assignable to the array component type - * @throws NullPointerException if array is null, or if array is primitive - * and value is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #setBoolean(Object, int, boolean) - * @see #setByte(Object, int, byte) - * @see #setChar(Object, int, char) - * @see #setShort(Object, int, short) - * @see #setInt(Object, int, int) - * @see #setLong(Object, int, long) - * @see #setFloat(Object, int, float) - * @see #setDouble(Object, int, double) - */ - public static void set(Object array, int index, Object value) - { - if (array instanceof Object[]) - { - // Too bad the API won't let us throw the easier ArrayStoreException! - if (value != null - && ! array.getClass().getComponentType().isInstance(value)) - throw new IllegalArgumentException(); - ((Object[]) array)[index] = value; - } - else if (value instanceof Byte) - setByte(array, index, ((Byte) value).byteValue()); - else if (value instanceof Short) - setShort(array, index, ((Short) value).shortValue()); - else if (value instanceof Integer) - setInt(array, index, ((Integer) value).intValue()); - else if (value instanceof Long) - setLong(array, index, ((Long) value).longValue()); - else if (value instanceof Float) - setFloat(array, index, ((Float) value).floatValue()); - else if (value instanceof Double) - setDouble(array, index, ((Double) value).doubleValue()); - else if (value instanceof Character) - setChar(array, index, ((Character) value).charValue()); - else if (value instanceof Boolean) - setBoolean(array, index, ((Boolean) value).booleanValue()); - else if (array == null) - throw new NullPointerException(); - else - throw new IllegalArgumentException(); - } - - /** - * Sets an element of a boolean array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not a boolean - * array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setBoolean(Object array, int index, boolean value) - { - if (array instanceof boolean[]) - ((boolean[]) array)[index] = value; - else if (array == null) - throw new NullPointerException(); - else - throw new IllegalArgumentException(); - } - - /** - * Sets an element of a byte array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not a byte, - * short, int, long, float, or double array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setByte(Object array, int index, byte value) - { - if (array instanceof byte[]) - ((byte[]) array)[index] = value; - else - setShort(array, index, value); - } - - /** - * Sets an element of a char array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not a char, - * int, long, float, or double array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setChar(Object array, int index, char value) - { - if (array instanceof char[]) - ((char[]) array)[index] = value; - else - setInt(array, index, value); - } - - /** - * Sets an element of a short array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not a short, - * int, long, float, or double array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setShort(Object array, int index, short value) - { - if (array instanceof short[]) - ((short[]) array)[index] = value; - else - setInt(array, index, value); - } - - /** - * Sets an element of an int array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not an int, - * long, float, or double array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setInt(Object array, int index, int value) - { - if (array instanceof int[]) - ((int[]) array)[index] = value; - else - setLong(array, index, value); - } - - /** - * Sets an element of a long array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not a long, - * float, or double array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setLong(Object array, int index, long value) - { - if (array instanceof long[]) - ((long[]) array)[index] = value; - else - setFloat(array, index, value); - } - - /** - * Sets an element of a float array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not a float - * or double array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setFloat(Object array, int index, float value) - { - if (array instanceof float[]) - ((float[]) array)[index] = value; - else - setDouble(array, index, value); - } - - /** - * Sets an element of a double array. - * - * @param array the array to set a value of - * @param index the array index to set the value to - * @param value the value to set - * @throws IllegalArgumentException if <code>array</code> is not a double - * array - * @throws NullPointerException if <code>array</code> is null - * @throws ArrayIndexOutOfBoundsException if <code>index</code> is out of - * bounds - * @see #set(Object, int, Object) - */ - public static void setDouble(Object array, int index, double value) - { - if (array instanceof double[]) - ((double[]) array)[index] = value; - else if (array == null) - throw new NullPointerException(); - else - throw new IllegalArgumentException(); - } - - /** - * Dynamically and recursively create a multi-dimensioned array of objects. - * - * @param type guaranteed to be a valid object type - * @param dimensions the dimensions of the array - * @param index index of the current dimension to build - * @return the new multi-dimensioned array - * @throws NegativeArraySizeException if any entry of dimensions is negative - * @throws OutOfMemoryError if memory allocation fails - */ - // This would be faster if implemented natively, using the multianewarray - // bytecode instead of this recursive call - private static Object createMultiArray(Class type, int[] dimensions, - int index) - { - if (index == dimensions.length - 1) - return newInstance(type, dimensions[index]); - - Object toAdd = createMultiArray(type, dimensions, index + 1); - Class thisType = toAdd.getClass(); - Object[] retval - = (Object[]) VMArray.createObjectArray(thisType, dimensions[index]); - if (dimensions[index] > 0) - retval[0] = toAdd; - int i = dimensions[index]; - while (--i > 0) - retval[i] = createMultiArray(type, dimensions, index + 1); - return retval; - } - -} diff --git a/libjava/classpath/java/lang/reflect/Constructor.java b/libjava/classpath/java/lang/reflect/Constructor.java deleted file mode 100644 index d6c8d79..0000000 --- a/libjava/classpath/java/lang/reflect/Constructor.java +++ /dev/null @@ -1,453 +0,0 @@ -/* java.lang.reflect.Constructor - reflection of Java constructors - Copyright (C) 1998, 2001, 2004, 2005 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; - -import gnu.java.lang.ClassHelper; -import gnu.java.lang.CPStringBuilder; - -import gnu.java.lang.reflect.MethodSignatureParser; - -import java.lang.annotation.Annotation; - -/** - * The Constructor class represents a constructor of a class. It also allows - * dynamic creation of an object, via reflection. Invocation on Constructor - * objects knows how to do widening conversions, but throws - * {@link IllegalArgumentException} if a narrowing conversion would be - * necessary. You can query for information on this Constructor regardless - * of location, but construction access may be limited by Java language - * access controls. If you can't do it in the compiler, you can't normally - * do it here either.<p> - * - * <B>Note:</B> This class returns and accepts types as Classes, even - * primitive types; there are Class types defined that represent each - * different primitive type. They are <code>java.lang.Boolean.TYPE, - * java.lang.Byte.TYPE,</code>, also available as <code>boolean.class, - * byte.class</code>, etc. These are not to be confused with the - * classes <code>java.lang.Boolean, java.lang.Byte</code>, etc., which are - * real classes.<p> - * - * Also note that this is not a serializable class. It is entirely feasible - * to make it serializable using the Externalizable interface, but this is - * on Sun, not me. - * - * @author John Keiser - * @author Eric Blake <ebb9@email.byu.edu> - * @see Member - * @see Class - * @see java.lang.Class#getConstructor(Class[]) - * @see java.lang.Class#getDeclaredConstructor(Class[]) - * @see java.lang.Class#getConstructors() - * @see java.lang.Class#getDeclaredConstructors() - * @since 1.1 - * @status updated to 1.4 - */ -public final class Constructor<T> - extends AccessibleObject - implements GenericDeclaration, Member -{ - private static final int CONSTRUCTOR_MODIFIERS - = Modifier.PRIVATE | Modifier.PROTECTED | Modifier.PUBLIC; - - private MethodSignatureParser p; - - VMConstructor cons; - - /** - * This class is uninstantiable outside this package. - */ - Constructor(VMConstructor cons) - { - this.cons = cons; - cons.cons = this; - } - - private Constructor() - { - } - - /** - * Gets the class that declared this constructor. - * @return the class that declared this member - */ - public Class<T> getDeclaringClass() - { - // Inescapable as the VM layer is 1.4 based. - @SuppressWarnings("unchecked") - Class<T> declClass = (Class<T>) cons.getDeclaringClass(); - return declClass; - } - - /** - * Gets the name of this constructor (the non-qualified name of the class - * it was declared in). - * @return the name of this constructor - */ - public String getName() - { - return cons.getDeclaringClass().getName(); - } - - /** - * Gets the modifiers this constructor uses. Use the <code>Modifier</code> - * class to interpret the values. A constructor can only have a subset of the - * following modifiers: public, private, protected. - * - * @return an integer representing the modifiers to this Member - * @see Modifier - */ - public int getModifiers() - { - return cons.getModifiersInternal() & CONSTRUCTOR_MODIFIERS; - } - - /** - * Return true if this constructor is synthetic, false otherwise. - * A synthetic member is one which is created by the compiler, - * and which does not appear in the user's source code. - * @since 1.5 - */ - public boolean isSynthetic() - { - return (cons.getModifiersInternal() & Modifier.SYNTHETIC) != 0; - } - - /** - * Return true if this is a varargs constructor, that is if - * the constructor takes a variable number of arguments. - * @since 1.5 - */ - public boolean isVarArgs() - { - return (cons.getModifiersInternal() & Modifier.VARARGS) != 0; - } - - /** - * Get the parameter list for this constructor, in declaration order. If the - * constructor takes no parameters, returns a 0-length array (not null). - * - * @return a list of the types of the constructor's parameters - */ - public Class<?>[] getParameterTypes() - { - return (Class<?>[]) cons.getParameterTypes(); - } - - /** - * Get the exception types this constructor says it throws, in no particular - * order. If the constructor has no throws clause, returns a 0-length array - * (not null). - * - * @return a list of the types in the constructor's throws clause - */ - public Class<?>[] getExceptionTypes() - { - return (Class<?>[]) cons.getExceptionTypes(); - } - - /** - * Compare two objects to see if they are semantically equivalent. - * Two Constructors are semantically equivalent if they have the same - * declaring class and the same parameter list. This ignores different - * exception clauses, but since you can't create a Method except through the - * VM, this is just the == relation. - * - * @param o the object to compare to - * @return <code>true</code> if they are equal; <code>false</code> if not. - */ - public boolean equals(Object o) - { - return cons.equals(o); - } - - /** - * Get the hash code for the Constructor. The Constructor hash code is the - * hash code of the declaring class's name. - * - * @return the hash code for the object - */ - public int hashCode() - { - return getName().hashCode(); - } - - /** - * Get a String representation of the Constructor. A Constructor's String - * representation is "<modifier> <classname>(<paramtypes>) - * throws <exceptions>", where everything after ')' is omitted if - * there are no exceptions.<br> Example: - * <code>public java.io.FileInputStream(java.lang.Runnable) - * throws java.io.FileNotFoundException</code> - * - * @return the String representation of the Constructor - */ - public String toString() - { - // 128 is a reasonable buffer initial size for constructor - CPStringBuilder sb = new CPStringBuilder(128); - Modifier.toString(getModifiers(), sb).append(' '); - sb.append(getDeclaringClass().getName()).append('('); - Class[] c = getParameterTypes(); - if (c.length > 0) - { - sb.append(ClassHelper.getUserName(c[0])); - for (int i = 1; i < c.length; i++) - sb.append(',').append(ClassHelper.getUserName(c[i])); - } - sb.append(')'); - c = getExceptionTypes(); - if (c.length > 0) - { - sb.append(" throws ").append(c[0].getName()); - for (int i = 1; i < c.length; i++) - sb.append(',').append(c[i].getName()); - } - return sb.toString(); - } - - static <X extends GenericDeclaration> - void addTypeParameters(CPStringBuilder sb, TypeVariable<X>[] typeArgs) - { - if (typeArgs.length == 0) - return; - sb.append('<'); - for (int i = 0; i < typeArgs.length; ++i) - { - if (i > 0) - sb.append(','); - sb.append(typeArgs[i]); - } - sb.append("> "); - } - - public String toGenericString() - { - CPStringBuilder sb = new CPStringBuilder(128); - Modifier.toString(getModifiers(), sb).append(' '); - addTypeParameters(sb, getTypeParameters()); - sb.append(getDeclaringClass().getName()).append('('); - Type[] types = getGenericParameterTypes(); - if (types.length > 0) - { - sb.append(types[0]); - for (int i = 1; i < types.length; ++i) - sb.append(',').append(types[i]); - } - sb.append(')'); - types = getGenericExceptionTypes(); - if (types.length > 0) - { - sb.append(" throws ").append(types[0]); - for (int i = 1; i < types.length; i++) - sb.append(',').append(types[i]); - } - return sb.toString(); - } - - /** - * Create a new instance by invoking the constructor. Arguments are - * automatically unwrapped and widened, if needed.<p> - * - * If this class is abstract, you will get an - * <code>InstantiationException</code>. If the constructor takes 0 - * arguments, you may use null or a 0-length array for <code>args</code>.<p> - * - * If this Constructor enforces access control, your runtime context is - * evaluated, and you may have an <code>IllegalAccessException</code> if - * you could not create this object in similar compiled code. If the class - * is uninitialized, you trigger class initialization, which may end in a - * <code>ExceptionInInitializerError</code>.<p> - * - * Then, the constructor is invoked. If it completes normally, the return - * value will be the new object. If it completes abruptly, the exception is - * wrapped in an <code>InvocationTargetException</code>. - * - * @param args the arguments to the constructor - * @return the newly created object - * @throws IllegalAccessException if the constructor could not normally be - * called by the Java code (i.e. it is not public) - * @throws IllegalArgumentException if the number of arguments is incorrect; - * or if the arguments types are wrong even with a widening - * conversion - * @throws InstantiationException if the class is abstract - * @throws InvocationTargetException if the constructor throws an exception - * @throws ExceptionInInitializerError if construction triggered class - * initialization, which then failed - */ - public T newInstance(Object... args) - throws InstantiationException, IllegalAccessException, - InvocationTargetException - { - // Inescapable as the VM layer is 1.4 based. - @SuppressWarnings("unchecked") - T ins = (T) cons.construct(args); - return ins; - } - - /** - * Returns an array of <code>TypeVariable</code> objects that represents - * the type variables declared by this constructor, in declaration order. - * An array of size zero is returned if this constructor has no type - * variables. - * - * @return the type variables associated with this constructor. - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public TypeVariable<Constructor<T>>[] getTypeParameters() - { - if (p == null) - { - String sig = cons.getSignature(); - if (sig == null) - return new TypeVariable[0]; - p = new MethodSignatureParser(this, sig); - } - return p.getTypeParameters(); - } - - /** - * Returns an array of <code>Type</code> objects that represents - * the exception types declared by this constructor, in declaration order. - * An array of size zero is returned if this constructor declares no - * exceptions. - * - * @return the exception types declared by this constructor. - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public Type[] getGenericExceptionTypes() - { - if (p == null) - { - String sig = cons.getSignature(); - if (sig == null) - return getExceptionTypes(); - p = new MethodSignatureParser(this, sig); - } - return p.getGenericExceptionTypes(); - } - - /** - * Returns an array of <code>Type</code> objects that represents - * the parameter list for this constructor, in declaration order. - * An array of size zero is returned if this constructor takes no - * parameters. - * - * @return a list of the types of the constructor's parameters - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public Type[] getGenericParameterTypes() - { - if (p == null) - { - String sig = cons.getSignature(); - if (sig == null) - return getParameterTypes(); - p = new MethodSignatureParser(this, sig); - } - return p.getGenericParameterTypes(); - } - - /** - * <p> - * Return an array of arrays representing the annotations on each - * of the constructor's parameters. The outer array is aligned against - * the parameters of the constructors and is thus equal in length to - * the number of parameters (thus having a length zero if there are none). - * Each array element in the outer array contains an inner array which - * holds the annotations. This array has a length of zero if the parameter - * has no annotations. - * </p> - * <p> - * The returned annotations are serialized. Changing the annotations has - * no affect on the return value of future calls to this method. - * </p> - * - * @return an array of arrays which represents the annotations used on the - * parameters of this constructor. The order of the array elements - * matches the declaration order of the parameters. - * @since 1.5 - */ - public Annotation[][] getParameterAnnotations() - { - return cons.getParameterAnnotations(); - } - - /** - * Returns the element's annotation for the specified annotation type, - * or <code>null</code> if no such annotation exists. - * - * @param annotationClass the type of annotation to look for. - * @return this element's annotation for the specified type, or - * <code>null</code> if no such annotation exists. - * @throws NullPointerException if the annotation class is <code>null</code>. - */ - public <T extends Annotation> T getAnnotation(Class<T> annotationClass) - { - // Inescapable as the VM layer is 1.4 based. - @SuppressWarnings("unchecked") - T ann = (T) cons.getAnnotation(annotationClass); - return ann; - } - - /** - * Returns all annotations directly defined by the element. If there are - * no annotations directly associated with the element, then a zero-length - * array will be returned. The returned array may be modified by the client - * code, but this will have no effect on the annotation content of this - * class, and hence no effect on the return value of this method for - * future callers. - * - * @return the annotations directly defined by the element. - * @since 1.5 - */ - public Annotation[] getDeclaredAnnotations() - { - return cons.getDeclaredAnnotations(); - } - -} diff --git a/libjava/classpath/java/lang/reflect/Field.java b/libjava/classpath/java/lang/reflect/Field.java deleted file mode 100644 index 29ca795..0000000 --- a/libjava/classpath/java/lang/reflect/Field.java +++ /dev/null @@ -1,735 +0,0 @@ -/* java.lang.reflect.Field - reflection of Java fields - Copyright (C) 1998, 2001, 2005, 2008 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; - -import gnu.java.lang.ClassHelper; -import gnu.java.lang.CPStringBuilder; - -import gnu.java.lang.reflect.FieldSignatureParser; - -import java.lang.annotation.Annotation; - -/** - * The Field class represents a member variable of a class. It also allows - * dynamic access to a member, via reflection. This works for both - * static and instance fields. Operations on Field objects know how to - * do widening conversions, but throw {@link IllegalArgumentException} if - * a narrowing conversion would be necessary. You can query for information - * on this Field regardless of location, but get and set access may be limited - * by Java language access controls. If you can't do it in the compiler, you - * can't normally do it here either.<p> - * - * <B>Note:</B> This class returns and accepts types as Classes, even - * primitive types; there are Class types defined that represent each - * different primitive type. They are <code>java.lang.Boolean.TYPE, - * java.lang.Byte.TYPE,</code>, also available as <code>boolean.class, - * byte.class</code>, etc. These are not to be confused with the - * classes <code>java.lang.Boolean, java.lang.Byte</code>, etc., which are - * real classes.<p> - * - * Also note that this is not a serializable class. It is entirely feasible - * to make it serializable using the Externalizable interface, but this is - * on Sun, not me. - * - * @author John Keiser - * @author Eric Blake <ebb9@email.byu.edu> - * @see Member - * @see Class - * @see Class#getField(String) - * @see Class#getDeclaredField(String) - * @see Class#getFields() - * @see Class#getDeclaredFields() - * @since 1.1 - * @status updated to 1.4 - */ -public final class Field -extends AccessibleObject implements Member -{ - static final int FIELD_MODIFIERS - = Modifier.FINAL | Modifier.PRIVATE | Modifier.PROTECTED - | Modifier.PUBLIC | Modifier.STATIC | Modifier.TRANSIENT - | Modifier.VOLATILE; - - private FieldSignatureParser p; - - VMField f; - - /** - * This class is uninstantiable outside the package. - */ - Field(VMField f) - { - this.f = f; - f.f = this; - } - - /** - * Gets the class that declared this field, or the class where this field - * is a non-inherited member. - * @return the class that declared this member - */ - public Class<?> getDeclaringClass() - { - return (Class<?>) f.getDeclaringClass(); - } - - /** - * Gets the name of this field. - * @return the name of this field - */ - public String getName() - { - return f.getName(); - } - - /** - * Gets the modifiers this field uses. Use the <code>Modifier</code> - * class to interpret the values. A field can only have a subset of the - * following modifiers: public, private, protected, static, final, - * transient, and volatile. - * - * @return an integer representing the modifiers to this Member - * @see Modifier - */ - public int getModifiers() - { - return f.getModifiersInternal() & FIELD_MODIFIERS; - } - - /** - * Return true if this field is synthetic, false otherwise. - * @since 1.5 - */ - public boolean isSynthetic() - { - return (f.getModifiersInternal() & Modifier.SYNTHETIC) != 0; - } - - /** - * Return true if this field represents an enum constant, - * false otherwise. - * @since 1.5 - */ - public boolean isEnumConstant() - { - return (f.getModifiersInternal() & Modifier.ENUM) != 0; - } - - /** - * Gets the type of this field. - * @return the type of this field - */ - public Class<?> getType() - { - return f.getType(); - } - - /** - * Compare two objects to see if they are semantically equivalent. - * Two Fields are semantically equivalent if they have the same declaring - * class, name, and type. Since you can't creat a Field except through - * the VM, this is just the == relation. - * - * @param o the object to compare to - * @return <code>true</code> if they are equal; <code>false</code> if not - */ - public boolean equals(Object o) - { - return f.equals(o); - } - - /** - * Get the hash code for the Field. The Field hash code is the hash code - * of its name XOR'd with the hash code of its class name. - * - * @return the hash code for the object. - */ - public int hashCode() - { - return f.getDeclaringClass().getName().hashCode() ^ f.getName().hashCode(); - } - - /** - * Get a String representation of the Field. A Field's String - * representation is "<modifiers> <type> - * <class>.<fieldname>".<br> Example: - * <code>public transient boolean gnu.parse.Parser.parseComplete</code> - * - * @return the String representation of the Field - */ - public String toString() - { - // 64 is a reasonable buffer initial size for field - CPStringBuilder sb = new CPStringBuilder(64); - Modifier.toString(getModifiers(), sb).append(' '); - sb.append(ClassHelper.getUserName(getType())).append(' '); - sb.append(getDeclaringClass().getName()).append('.'); - sb.append(getName()); - return sb.toString(); - } - - public String toGenericString() - { - CPStringBuilder sb = new CPStringBuilder(64); - Modifier.toString(getModifiers(), sb).append(' '); - sb.append(getGenericType()).append(' '); - sb.append(getDeclaringClass().getName()).append('.'); - sb.append(getName()); - return sb.toString(); - } - - /** - * Get the value of this Field. If it is primitive, it will be wrapped - * in the appropriate wrapper type (boolean = java.lang.Boolean).<p> - * - * If the field is static, <code>o</code> will be ignored. Otherwise, if - * <code>o</code> is null, you get a <code>NullPointerException</code>, - * and if it is incompatible with the declaring class of the field, you - * get an <code>IllegalArgumentException</code>.<p> - * - * Next, if this Field enforces access control, your runtime context is - * evaluated, and you may have an <code>IllegalAccessException</code> if - * you could not access this field in similar compiled code. If the field - * is static, and its class is uninitialized, you trigger class - * initialization, which may end in a - * <code>ExceptionInInitializerError</code>.<p> - * - * Finally, the field is accessed, and primitives are wrapped (but not - * necessarily in new objects). This method accesses the field of the - * declaring class, even if the instance passed in belongs to a subclass - * which declares another field to hide this one. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if <code>o</code> is not an instance of - * the class or interface declaring this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #getBoolean(Object) - * @see #getByte(Object) - * @see #getChar(Object) - * @see #getShort(Object) - * @see #getInt(Object) - * @see #getLong(Object) - * @see #getFloat(Object) - * @see #getDouble(Object) - */ - public Object get(Object o) - throws IllegalAccessException - { - return f.get(o); - } - - /** - * Get the value of this boolean Field. If the field is static, - * <code>o</code> will be ignored. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a boolean field of - * <code>o</code>, or if <code>o</code> is not an instance of the - * declaring class of this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public boolean getBoolean(Object o) - throws IllegalAccessException - { - return f.getBoolean(o); - } - - /** - * Get the value of this byte Field. If the field is static, - * <code>o</code> will be ignored. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a byte field of - * <code>o</code>, or if <code>o</code> is not an instance of the - * declaring class of this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public byte getByte(Object o) - throws IllegalAccessException - { - return f.getByte(o); - } - - /** - * Get the value of this Field as a char. If the field is static, - * <code>o</code> will be ignored. - * - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a char field of - * <code>o</code>, or if <code>o</code> is not an instance - * of the declaring class of this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public char getChar(Object o) - throws IllegalAccessException - { - return f.getChar(o); - } - - /** - * Get the value of this Field as a short. If the field is static, - * <code>o</code> will be ignored. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a byte or short - * field of <code>o</code>, or if <code>o</code> is not an instance - * of the declaring class of this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public short getShort(Object o) - throws IllegalAccessException - { - return f.getShort(o); - } - - /** - * Get the value of this Field as an int. If the field is static, - * <code>o</code> will be ignored. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a byte, short, char, or - * int field of <code>o</code>, or if <code>o</code> is not an - * instance of the declaring class of this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public int getInt(Object o) - throws IllegalAccessException - { - return f.getInt(o); - } - - /** - * Get the value of this Field as a long. If the field is static, - * <code>o</code> will be ignored. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a byte, short, char, int, - * or long field of <code>o</code>, or if <code>o</code> is not an - * instance of the declaring class of this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public long getLong(Object o) - throws IllegalAccessException - { - return f.getLong(o); - } - - /** - * Get the value of this Field as a float. If the field is static, - * <code>o</code> will be ignored. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a byte, short, char, int, - * long, or float field of <code>o</code>, or if <code>o</code> is - * not an instance of the declaring class of this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public float getFloat(Object o) - throws IllegalAccessException - { - return f.getFloat(o); - } - - /** - * Get the value of this Field as a double. If the field is static, - * <code>o</code> will be ignored. - * - * @param o the object to get the value of this Field from - * @return the value of the Field - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a byte, short, char, int, - * long, float, or double field of <code>o</code>, or if - * <code>o</code> is not an instance of the declaring class of this - * field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #get(Object) - */ - public double getDouble(Object o) - throws IllegalAccessException - { - return f.getDouble(o); - } - - /** - * Set the value of this Field. If it is a primitive field, the value - * will be unwrapped from the passed object (boolean = java.lang.Boolean).<p> - * - * If the field is static, <code>o</code> will be ignored. Otherwise, if - * <code>o</code> is null, you get a <code>NullPointerException</code>, - * and if it is incompatible with the declaring class of the field, you - * get an <code>IllegalArgumentException</code>.<p> - * - * Next, if this Field enforces access control, your runtime context is - * evaluated, and you may have an <code>IllegalAccessException</code> if - * you could not access this field in similar compiled code. This also - * occurs whether or not there is access control if the field is final. - * If the field is primitive, and unwrapping your argument fails, you will - * get an <code>IllegalArgumentException</code>; likewise, this error - * happens if <code>value</code> cannot be cast to the correct object type. - * If the field is static, and its class is uninitialized, you trigger class - * initialization, which may end in a - * <code>ExceptionInInitializerError</code>.<p> - * - * Finally, the field is set with the widened value. This method accesses - * the field of the declaring class, even if the instance passed in belongs - * to a subclass which declares another field to hide this one. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if <code>value</code> cannot be - * converted by a widening conversion to the underlying type of - * the Field, or if <code>o</code> is not an instance of the class - * declaring this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #setBoolean(Object, boolean) - * @see #setByte(Object, byte) - * @see #setChar(Object, char) - * @see #setShort(Object, short) - * @see #setInt(Object, int) - * @see #setLong(Object, long) - * @see #setFloat(Object, float) - * @see #setDouble(Object, double) - */ - public void set(Object o, Object value) - throws IllegalAccessException - { - f.set(o, value); - } - - /** - * Set this boolean Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a boolean field, or if - * <code>o</code> is not an instance of the class declaring this - * field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setBoolean(Object o, boolean value) - throws IllegalAccessException - { - f.setBoolean(o, value); - } - - /** - * Set this byte Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a byte, short, int, long, - * float, or double field, or if <code>o</code> is not an instance - * of the class declaring this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setByte(Object o, byte value) - throws IllegalAccessException - { - f.setByte(o, value); - } - - /** - * Set this char Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a char, int, long, - * float, or double field, or if <code>o</code> is not an instance - * of the class declaring this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setChar(Object o, char value) - throws IllegalAccessException - { - f.setChar(o, value); - } - - /** - * Set this short Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a short, int, long, - * float, or double field, or if <code>o</code> is not an instance - * of the class declaring this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setShort(Object o, short value) - throws IllegalAccessException - { - f.setShort(o, value); - } - - /** - * Set this int Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not an int, long, float, or - * double field, or if <code>o</code> is not an instance of the - * class declaring this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setInt(Object o, int value) - throws IllegalAccessException - { - f.setInt(o, value); - } - - /** - * Set this long Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a long, float, or double - * field, or if <code>o</code> is not an instance of the class - * declaring this field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setLong(Object o, long value) - throws IllegalAccessException - { - f.setLong(o, value); - } - - /** - * Set this float Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a float or long field, or - * if <code>o</code> is not an instance of the class declaring this - * field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setFloat(Object o, float value) - throws IllegalAccessException - { - f.setFloat(o, value); - } - - /** - * Set this double Field. If the field is static, <code>o</code> will be - * ignored. - * - * @param o the object to set this Field on - * @param value the value to set this Field to - * @throws IllegalAccessException if you could not normally access this field - * (i.e. it is not public) - * @throws IllegalArgumentException if this is not a double field, or if - * <code>o</code> is not an instance of the class declaring this - * field - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static field triggered - * class initialization, which then failed - * @see #set(Object, Object) - */ - public void setDouble(Object o, double value) - throws IllegalAccessException - { - f.setDouble(o, value); - } - - /** - * Return the generic type of the field. If the field type is not a generic - * type, the method returns the same as <code>getType()</code>. - * - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public Type getGenericType() - { - if (p == null) - { - String signature = f.getSignature(); - if (signature == null) - return getType(); - p = new FieldSignatureParser(getDeclaringClass(), - signature); - } - return p.getFieldType(); - } - - /** - * Returns the element's annotation for the specified annotation type, - * or <code>null</code> if no such annotation exists. - * - * @param annotationClass the type of annotation to look for. - * @return this element's annotation for the specified type, or - * <code>null</code> if no such annotation exists. - * @throws NullPointerException if the annotation class is <code>null</code>. - */ - public <T extends Annotation> T getAnnotation(Class<T> annotationClass) - { - // Inescapable as the VM layer is 1.4 based. T will erase to Annotation anyway. - @SuppressWarnings("unchecked") T ann = (T) f.getAnnotation(annotationClass); - return ann; - } - - /** - * Returns all annotations directly defined by the element. If there are - * no annotations directly associated with the element, then a zero-length - * array will be returned. The returned array may be modified by the client - * code, but this will have no effect on the annotation content of this - * class, and hence no effect on the return value of this method for - * future callers. - * - * @return the annotations directly defined by the element. - * @since 1.5 - */ - public Annotation[] getDeclaredAnnotations() - { - return f.getDeclaredAnnotations(); - } - -} diff --git a/libjava/classpath/java/lang/reflect/GenericArrayType.java b/libjava/classpath/java/lang/reflect/GenericArrayType.java deleted file mode 100644 index 2e08024..0000000 --- a/libjava/classpath/java/lang/reflect/GenericArrayType.java +++ /dev/null @@ -1,61 +0,0 @@ -/* GenericArrayType.java - Represent an array type with a generic component - Copyright (C) 2004, 2005 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; - -/** - * Represents the type of an array's components, which may be - * either a parameterized type or a type variable. - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public interface GenericArrayType - extends Type -{ - - /** - * Returns the <code>Type</code> of the components within the array. - * - * @return a <code>Type</code> instance representing the type of - * the array's components. - */ - Type getGenericComponentType(); - -} diff --git a/libjava/classpath/java/lang/reflect/GenericDeclaration.java b/libjava/classpath/java/lang/reflect/GenericDeclaration.java deleted file mode 100644 index d78aba9..0000000 --- a/libjava/classpath/java/lang/reflect/GenericDeclaration.java +++ /dev/null @@ -1,62 +0,0 @@ -/* GenericDeclaration.java - Copyright (C) 2004 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; - -/** - * Represents an entity that declares one or more type parameters. - * This includes classes and methods (including constructors). - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public interface GenericDeclaration -{ - /** - * Returns a <code>TypeVariable</code> object for each type variable - * declared by this entity, in order of declaration. An empty array - * is returned if no type variables are declared. - * - * @return an array of <code>TypeVariable</code> objects. - * @throws GenericSignatureFormatError if the signature format within the - * class file does not conform to that specified in the 3rd edition - * of the Java Virtual Machine Specification. - */ - TypeVariable<?>[] getTypeParameters(); -} diff --git a/libjava/classpath/java/lang/reflect/GenericSignatureFormatError.java b/libjava/classpath/java/lang/reflect/GenericSignatureFormatError.java deleted file mode 100644 index 0f09522..0000000 --- a/libjava/classpath/java/lang/reflect/GenericSignatureFormatError.java +++ /dev/null @@ -1,63 +0,0 @@ -/* GenericSignatureFormatError.java - Thrown when a signature is malformed. - Copyright (C) 2004, 2005 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; - -/** - * Thrown on encountering a syntactically malformed signature in - * a reflective method. During reflection, the generic type signature - * of a type, method or constructor may be interpreted by the virtual - * machine. This error is thrown if this operation fails. - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public class GenericSignatureFormatError - extends ClassFormatError -{ - private static final long serialVersionUID = 6709919147137911034L; - - /** - * Constructs a new <code>GenericSignatureFormatError</code>. - */ - public GenericSignatureFormatError() - { - } - -} diff --git a/libjava/classpath/java/lang/reflect/InvocationHandler.java b/libjava/classpath/java/lang/reflect/InvocationHandler.java deleted file mode 100644 index 3d30afd..0000000 --- a/libjava/classpath/java/lang/reflect/InvocationHandler.java +++ /dev/null @@ -1,137 +0,0 @@ -/* 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; - -} diff --git a/libjava/classpath/java/lang/reflect/InvocationTargetException.java b/libjava/classpath/java/lang/reflect/InvocationTargetException.java deleted file mode 100644 index 4480fc6..0000000 --- a/libjava/classpath/java/lang/reflect/InvocationTargetException.java +++ /dev/null @@ -1,123 +0,0 @@ -/* InvocationTargetException.java -- Wrapper exception for reflection - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2012 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; - -/** - * InvocationTargetException is sort of a way to "wrap" whatever exception - * comes up when a method or constructor is called via Reflection. As of - * JDK 1.4, it was retrofitted to match the exception chaining of all other - * exceptions, but <code>getTargetException()</code> still works. - * - * @author John Keiser - * @author Tom Tromey (tromey@cygnus.com) - * @author Eric Blake (ebb9@email.byu.edu) - * @see Method#invoke(Object,Object[]) - * @see Constructor#newInstance(Object[]) - * @since 1.1 - * @status updated to 1.7 - */ -public class InvocationTargetException extends ReflectiveOperationException -{ - /** - * Compatible with JDK 1.1+. - */ - private static final long serialVersionUID = 4085088731926701167L; - - /** - * The chained exception. This field is only around for serial compatibility. - * - * @serial the chained exception - */ - private final Throwable target; - - /** - * Construct an exception with null as the cause. The cause is initialized - * to null. - */ - protected InvocationTargetException() - { - this(null, null); - } - - /** - * Create an <code>InvocationTargetException</code> using another - * exception. - * - * @param targetException the exception to wrap - */ - public InvocationTargetException(Throwable targetException) - { - this(targetException, null); - } - - /** - * Create an <code>InvocationTargetException</code> using another - * exception and an error message. - * - * @param targetException the exception to wrap - * @param err an extra reason for the exception-throwing - */ - public InvocationTargetException(Throwable targetException, String err) - { - super(err, targetException); - target = targetException; - } - - /** - * Get the wrapped (targeted) exception. - * - * @return the targeted exception - * @see #getCause() - */ - public Throwable getTargetException() - { - return target; - } - - /** - * Returns the cause of this exception (which may be null). - * - * @return the cause - * @since 1.4 - */ - public Throwable getCause() - { - return target; - } -} diff --git a/libjava/classpath/java/lang/reflect/MalformedParameterizedTypeException.java b/libjava/classpath/java/lang/reflect/MalformedParameterizedTypeException.java deleted file mode 100644 index bfbe3bc..0000000 --- a/libjava/classpath/java/lang/reflect/MalformedParameterizedTypeException.java +++ /dev/null @@ -1,60 +0,0 @@ -/* MalformedParameterizedTypeException.java - Copyright (C) 2005 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 exception class is thrown when one of the reflection - * methods encountered an invalid parameterized type within - * the metadata of a class. One possible reason for this - * exception being thrown is the specification of too few or - * too many type variables. - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public class MalformedParameterizedTypeException - extends RuntimeException -{ - private static final long serialVersionUID = -5696557788586220964L; - - public MalformedParameterizedTypeException() - { - } -} diff --git a/libjava/classpath/java/lang/reflect/Member.java b/libjava/classpath/java/lang/reflect/Member.java deleted file mode 100644 index 945fbf6..0000000 --- a/libjava/classpath/java/lang/reflect/Member.java +++ /dev/null @@ -1,109 +0,0 @@ -/* java.lang.reflect.Member - common query methods in reflection - Copyright (C) 1998, 1999, 2001, 2005 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; - -/** - * Member is an interface that represents any member of a class (field or - * method) or a constructor. You can get information about the declaring - * class, name or modifiers of the member with this interface. - * - * @author John Keiser - * @author Per Bothner (bothner@cygnus.com) - * @author Eric Blake (ebb9@email.byu.edu) - * @see Class - * @see Field - * @see Method - * @see Constructor - * @since 1.1 - * @status updated to 1.4 - */ -public interface Member -{ - /** - * Represents all members, whether public, private, protected or - * package-protected, but only which are declared in this class. - * Used in SecurityManager.checkMemberAccess() to determine the - * type of members to access. - * @see SecurityManager#checkMemberAccess(Class, int) - */ - int DECLARED = 1; - - /** - * Represents public members only, but includes all inherited members. - * Used in SecurityManager.checkMemberAccess() to determine the type of - * members to access. - * @see SecurityManager#checkMemberAccess(Class, int) - */ - int PUBLIC = 0; - - /** - * Gets the class that declared this member. This is not the class where - * this method was called, or even the class where this Member object - * came to life, but the class that declares the member this represents. - * - * @return the class that declared this member - */ - Class<?> getDeclaringClass(); - - /** - * Gets the simple name of this member. This will be a valid Java - * identifier, with no qualification. - * - * @return the name of this member - */ - String getName(); - - /** - * Gets the modifiers this member uses. Use the <code>Modifier</code> - * class to interpret the values. - * - * @return an integer representing the modifiers to this Member - * @see Modifier - */ - int getModifiers(); - - /** - * Return true if this member is synthetic, meaning that it was - * created by the compiler and does not appear in the user's - * source code. - * @return true if the member is synthetic - * @since 1.5 - */ - boolean isSynthetic(); -} diff --git a/libjava/classpath/java/lang/reflect/Method.java b/libjava/classpath/java/lang/reflect/Method.java deleted file mode 100644 index fe4b2eb..0000000 --- a/libjava/classpath/java/lang/reflect/Method.java +++ /dev/null @@ -1,497 +0,0 @@ -/* java.lang.reflect.Method - reflection of Java methods - Copyright (C) 1998, 2001, 2002, 2005, 2007, 2008 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; - -import gnu.java.lang.ClassHelper; -import gnu.java.lang.CPStringBuilder; - -import gnu.java.lang.reflect.MethodSignatureParser; - -import java.lang.annotation.Annotation; - -/** - * The Method class represents a member method of a class. It also allows - * dynamic invocation, via reflection. This works for both static and - * instance methods. Invocation on Method objects knows how to do - * widening conversions, but throws {@link IllegalArgumentException} if - * a narrowing conversion would be necessary. You can query for information - * on this Method regardless of location, but invocation access may be limited - * by Java language access controls. If you can't do it in the compiler, you - * can't normally do it here either.<p> - * - * <B>Note:</B> This class returns and accepts types as Classes, even - * primitive types; there are Class types defined that represent each - * different primitive type. They are <code>java.lang.Boolean.TYPE, - * java.lang.Byte.TYPE,</code>, also available as <code>boolean.class, - * byte.class</code>, etc. These are not to be confused with the - * classes <code>java.lang.Boolean, java.lang.Byte</code>, etc., which are - * real classes.<p> - * - * Also note that this is not a serializable class. It is entirely feasible - * to make it serializable using the Externalizable interface, but this is - * on Sun, not me. - * - * @author John Keiser - * @author Eric Blake <ebb9@email.byu.edu> - * @see Member - * @see Class - * @see java.lang.Class#getMethod(String,Class[]) - * @see java.lang.Class#getDeclaredMethod(String,Class[]) - * @see java.lang.Class#getMethods() - * @see java.lang.Class#getDeclaredMethods() - * @since 1.1 - * @status updated to 1.4 - */ -public final class Method -extends AccessibleObject implements Member, GenericDeclaration -{ - private static final int METHOD_MODIFIERS - = Modifier.ABSTRACT | Modifier.FINAL | Modifier.NATIVE - | Modifier.PRIVATE | Modifier.PROTECTED | Modifier.PUBLIC - | Modifier.STATIC | Modifier.STRICT | Modifier.SYNCHRONIZED; - - private MethodSignatureParser p; - - VMMethod m; - - /** - * This class is uninstantiable outside this package. - */ - Method(VMMethod m) - { - this.m = m; - m.m = this; - } - - /** - * Gets the class that declared this method, or the class where this method - * is a non-inherited member. - * @return the class that declared this member - */ - public Class<?> getDeclaringClass() - { - return (Class<?>) m.getDeclaringClass(); - } - - /** - * Gets the name of this method. - * @return the name of this method - */ - public String getName() - { - return m.getName(); - } - - /** - * Gets the modifiers this method uses. Use the <code>Modifier</code> - * class to interpret the values. A method can only have a subset of the - * following modifiers: public, private, protected, abstract, static, - * final, synchronized, native, and strictfp. - * - * @return an integer representing the modifiers to this Member - * @see Modifier - */ - public int getModifiers() - { - return m.getModifiersInternal() & METHOD_MODIFIERS; - } - - /** - * Return true if this method is a bridge method. A bridge method - * is generated by the compiler in some situations involving - * generics and inheritance. - * @since 1.5 - */ - public boolean isBridge() - { - return (m.getModifiersInternal() & Modifier.BRIDGE) != 0; - } - - /** - * Return true if this method is synthetic, false otherwise. - * @since 1.5 - */ - public boolean isSynthetic() - { - return (m.getModifiersInternal() & Modifier.SYNTHETIC) != 0; - } - - /** - * Return true if this is a varargs method, that is if - * the method takes a variable number of arguments. - * @since 1.5 - */ - public boolean isVarArgs() - { - return (m.getModifiersInternal() & Modifier.VARARGS) != 0; - } - - /** - * Gets the return type of this method. - * @return the type of this method - */ - public Class<?> getReturnType() - { - return (Class<?>) m.getReturnType(); - } - - /** - * Get the parameter list for this method, in declaration order. If the - * method takes no parameters, returns a 0-length array (not null). - * - * @return a list of the types of the method's parameters - */ - public Class<?>[] getParameterTypes() - { - return (Class<?>[]) m.getParameterTypes(); - } - - /** - * Get the exception types this method says it throws, in no particular - * order. If the method has no throws clause, returns a 0-length array - * (not null). - * - * @return a list of the types in the method's throws clause - */ - public Class<?>[] getExceptionTypes() - { - return (Class<?>[]) m.getExceptionTypes(); - } - - /** - * Compare two objects to see if they are semantically equivalent. - * Two Methods are semantically equivalent if they have the same declaring - * class, name, parameter list, and return type. - * - * @param o the object to compare to - * @return <code>true</code> if they are equal; <code>false</code> if not - */ - public boolean equals(Object o) - { - return m.equals(o); - } - - /** - * Get the hash code for the Method. The Method hash code is the hash code - * of its name XOR'd with the hash code of its class name. - * - * @return the hash code for the object - */ - public int hashCode() - { - return m.getDeclaringClass().getName().hashCode() ^ m.getName().hashCode(); - } - - /** - * Get a String representation of the Method. A Method's String - * representation is "<modifiers> <returntype> - * <methodname>(<paramtypes>) throws <exceptions>", where - * everything after ')' is omitted if there are no exceptions.<br> Example: - * <code>public static int run(java.lang.Runnable,int)</code> - * - * @return the String representation of the Method - */ - public String toString() - { - // 128 is a reasonable buffer initial size for constructor - CPStringBuilder sb = new CPStringBuilder(128); - Modifier.toString(getModifiers(), sb).append(' '); - sb.append(ClassHelper.getUserName(getReturnType())).append(' '); - sb.append(getDeclaringClass().getName()).append('.'); - sb.append(getName()).append('('); - Class[] c = getParameterTypes(); - if (c.length > 0) - { - sb.append(ClassHelper.getUserName(c[0])); - for (int i = 1; i < c.length; i++) - sb.append(',').append(ClassHelper.getUserName(c[i])); - } - sb.append(')'); - c = getExceptionTypes(); - if (c.length > 0) - { - sb.append(" throws ").append(c[0].getName()); - for (int i = 1; i < c.length; i++) - sb.append(',').append(c[i].getName()); - } - return sb.toString(); - } - - public String toGenericString() - { - // 128 is a reasonable buffer initial size for constructor - CPStringBuilder sb = new CPStringBuilder(128); - Modifier.toString(getModifiers(), sb).append(' '); - Constructor.addTypeParameters(sb, getTypeParameters()); - sb.append(getGenericReturnType()).append(' '); - sb.append(getDeclaringClass().getName()).append('.'); - sb.append(getName()).append('('); - Type[] types = getGenericParameterTypes(); - if (types.length > 0) - { - sb.append(types[0]); - for (int i = 1; i < types.length; i++) - sb.append(',').append(types[i]); - } - sb.append(')'); - types = getGenericExceptionTypes(); - if (types.length > 0) - { - sb.append(" throws ").append(types[0]); - for (int i = 1; i < types.length; i++) - sb.append(',').append(types[i]); - } - return sb.toString(); - } - - /** - * Invoke the method. Arguments are automatically unwrapped and widened, - * and the result is automatically wrapped, if needed.<p> - * - * If the method is static, <code>o</code> will be ignored. Otherwise, - * the method uses dynamic lookup as described in JLS 15.12.4.4. You cannot - * mimic the behavior of nonvirtual lookup (as in super.foo()). This means - * you will get a <code>NullPointerException</code> if <code>o</code> is - * null, and an <code>IllegalArgumentException</code> if it is incompatible - * with the declaring class of the method. If the method takes 0 arguments, - * you may use null or a 0-length array for <code>args</code>.<p> - * - * Next, if this Method enforces access control, your runtime context is - * evaluated, and you may have an <code>IllegalAccessException</code> if - * you could not acces this method in similar compiled code. If the method - * is static, and its class is uninitialized, you trigger class - * initialization, which may end in a - * <code>ExceptionInInitializerError</code>.<p> - * - * Finally, the method is invoked. If it completes normally, the return value - * will be null for a void method, a wrapped object for a primitive return - * method, or the actual return of an Object method. If it completes - * abruptly, the exception is wrapped in an - * <code>InvocationTargetException</code>. - * - * @param o the object to invoke the method on - * @param args the arguments to the method - * @return the return value of the method, wrapped in the appropriate - * wrapper if it is primitive - * @throws IllegalAccessException if the method could not normally be called - * by the Java code (i.e. it is not public) - * @throws IllegalArgumentException if the number of arguments is incorrect; - * if the arguments types are wrong even with a widening conversion; - * or if <code>o</code> is not an instance of the class or interface - * declaring this method - * @throws InvocationTargetException if the method throws an exception - * @throws NullPointerException if <code>o</code> is null and this field - * requires an instance - * @throws ExceptionInInitializerError if accessing a static method triggered - * class initialization, which then failed - */ - public Object invoke(Object o, Object... args) - throws IllegalAccessException, InvocationTargetException - { - return m.invoke(o, args); - } - - /** - * Returns an array of <code>TypeVariable</code> objects that represents - * the type variables declared by this constructor, in declaration order. - * An array of size zero is returned if this class has no type - * variables. - * - * @return the type variables associated with this class. - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public TypeVariable<Method>[] getTypeParameters() - { - if (p == null) - { - String sig = m.getSignature(); - if (sig == null) - return (TypeVariable<Method>[]) new TypeVariable[0]; - p = new MethodSignatureParser(this, sig); - } - return p.getTypeParameters(); - } - - /** - * Returns an array of <code>Type</code> objects that represents - * the exception types declared by this method, in declaration order. - * An array of size zero is returned if this method declares no - * exceptions. - * - * @return the exception types declared by this method. - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public Type[] getGenericExceptionTypes() - { - if (p == null) - { - String sig = m.getSignature(); - if (sig == null) - return getExceptionTypes(); - p = new MethodSignatureParser(this, sig); - } - return p.getGenericExceptionTypes(); - } - - /** - * Returns an array of <code>Type</code> objects that represents - * the parameter list for this method, in declaration order. - * An array of size zero is returned if this method takes no - * parameters. - * - * @return a list of the types of the method's parameters - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public Type[] getGenericParameterTypes() - { - if (p == null) - { - String sig = m.getSignature(); - if (sig == null) - return getParameterTypes(); - p = new MethodSignatureParser(this, sig); - } - return p.getGenericParameterTypes(); - } - - /** - * Returns the return type of this method. - * - * @return the return type of this method - * @throws GenericSignatureFormatError if the generic signature does - * not conform to the format specified in the Virtual Machine - * specification, version 3. - * @since 1.5 - */ - public Type getGenericReturnType() - { - if (p == null) - { - String sig = m.getSignature(); - if (sig == null) - return getReturnType(); - p = new MethodSignatureParser(this, sig); - } - return p.getGenericReturnType(); - } - - /** - * If this method is an annotation method, returns the default - * value for the method. If there is no default value, or if the - * method is not a member of an annotation type, returns null. - * Primitive types are wrapped. - * - * @throws TypeNotPresentException if the method returns a Class, - * and the class cannot be found - * - * @since 1.5 - */ - public Object getDefaultValue() - { - return m.getDefaultValue(); - } - - /** - * <p> - * Return an array of arrays representing the annotations on each - * of the method's parameters. The outer array is aligned against - * the parameters of the method and is thus equal in length to - * the number of parameters (thus having a length zero if there are none). - * Each array element in the outer array contains an inner array which - * holds the annotations. This array has a length of zero if the parameter - * has no annotations. - * </p> - * <p> - * The returned annotations are serialized. Changing the annotations has - * no affect on the return value of future calls to this method. - * </p> - * - * @return an array of arrays which represents the annotations used on the - * parameters of this method. The order of the array elements - * matches the declaration order of the parameters. - * @since 1.5 - */ - public Annotation[][] getParameterAnnotations() - { - return m.getParameterAnnotations(); - } - - /** - * Returns the element's annotation for the specified annotation type, - * or <code>null</code> if no such annotation exists. - * - * @param annotationClass the type of annotation to look for. - * @return this element's annotation for the specified type, or - * <code>null</code> if no such annotation exists. - * @throws NullPointerException if the annotation class is <code>null</code>. - */ - public <T extends Annotation> T getAnnotation(Class<T> annotationClass) - { - // Inescapable as the VM layer is 1.4 based. T will erase to Annotation anyway. - @SuppressWarnings("unchecked") - T ann = (T) m.getAnnotation(annotationClass); - return ann; - } - - /** - * Returns all annotations directly defined by the element. If there are - * no annotations directly associated with the element, then a zero-length - * array will be returned. The returned array may be modified by the client - * code, but this will have no effect on the annotation content of this - * class, and hence no effect on the return value of this method for - * future callers. - * - * @return the annotations directly defined by the element. - * @since 1.5 - */ - public Annotation[] getDeclaredAnnotations() - { - return m.getDeclaredAnnotations(); - } - -} diff --git a/libjava/classpath/java/lang/reflect/Modifier.java b/libjava/classpath/java/lang/reflect/Modifier.java deleted file mode 100644 index c75f7b8..0000000 --- a/libjava/classpath/java/lang/reflect/Modifier.java +++ /dev/null @@ -1,394 +0,0 @@ -/* java.lang.reflect.Modifier - Copyright (C) 1998, 1999, 2001, 2002, 2005, 2008, 2012 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; - -import gnu.java.lang.CPStringBuilder; - -/** - * Modifier is a helper class with static methods to determine whether an - * int returned from getModifiers() represents static, public, protected, - * native, final, etc... and provides an additional method to print - * out all of the modifiers in an int in order. - * <p> - * The methods in this class use the bitmask values in the VM spec to - * determine the modifiers of an int. This means that a VM must return a - * standard mask, conformant with the VM spec. I don't know if this is how - * Sun does it, but I'm willing to bet money that it is. - * - * @author John Keiser - * @author Tom Tromey (tromey@cygnus.com) - * @author Eric Blake (ebb9@email.byu.edu) - * @see Member#getModifiers() - * @see Method#getModifiers() - * @see Field#getModifiers() - * @see Constructor#getModifiers() - * @see Class#getModifiers() - * @since 1.1 - */ -public class Modifier -{ - /** <STRONG>This constructor really shouldn't be here ... there are no - * instance methods or variables of this class, so instantiation is - * worthless. However, this function is in the 1.1 spec, so it is added - * for completeness.</STRONG> - */ - public Modifier() - { - } - - /** - * Public: accessible from any other class. - */ - public static final int PUBLIC = 0x0001; - - /** - * Private: accessible only from the same enclosing class. - */ - public static final int PRIVATE = 0x0002; - - /** - * Protected: accessible only to subclasses, or within the package. - */ - public static final int PROTECTED = 0x0004; - - /** - * Static:<br><ul> - * <li>Class: no enclosing instance for nested class.</li> - * <li>Field or Method: can be accessed or invoked without an - * instance of the declaring class.</li> - * </ul> - */ - public static final int STATIC = 0x0008; - - /** - * Final:<br><ul> - * <li>Class: no subclasses allowed.</li> - * <li>Field: cannot be changed.</li> - * <li>Method: cannot be overriden.</li> - * </ul> - */ - public static final int FINAL = 0x0010; - - /** - * Synchronized: Method: lock the class while calling this method. - */ - public static final int SYNCHRONIZED = 0x0020; - - /** - * Volatile: Field: cannot be cached. - */ - public static final int VOLATILE = 0x0040; - - /** - * Transient: Field: not serialized or deserialized. - */ - public static final int TRANSIENT = 0x0080; - - /** - * Native: Method: use JNI to call this method. - */ - public static final int NATIVE = 0x0100; - - /** - * Interface: Class: is an interface. - */ - public static final int INTERFACE = 0x0200; - - /** - * Abstract:<br><ul> - * <li>Class: may not be instantiated.</li> - * <li>Method: may not be called.</li> - * </ul> - */ - public static final int ABSTRACT = 0x0400; - - /** - * Strictfp: Method: expressions are FP-strict.<p> - * Also used as a modifier for classes, to mean that all initializers - * and constructors are FP-strict, but does not show up in - * Class.getModifiers. - */ - public static final int STRICT = 0x0800; - - - /** - * Super - treat invokespecial as polymorphic so that super.foo() works - * according to the JLS. This is a reuse of the synchronized constant - * to patch a hole in JDK 1.0. *shudder*. - */ - static final int SUPER = 0x0020; - - /** - * All the flags, only used by code in this package. - */ - static final int ALL_FLAGS = 0xfff; - - /** - * Flag indicating a bridge method. - */ - static final int BRIDGE = 0x40; - - /** - * Flag indicating a varargs method. - */ - static final int VARARGS = 0x80; - - /** - * Flag indicating a synthetic member. - */ - static final int SYNTHETIC = 0x1000; - - /** - * Flag indicating an enum constant or an enum class. - */ - static final int ENUM = 0x4000; - - /** - * Check whether the given modifier is abstract. - * @param mod the modifier. - * @return <code>true</code> if abstract, <code>false</code> otherwise. - */ - public static boolean isAbstract(int mod) - { - return (mod & ABSTRACT) != 0; - } - - /** - * Check whether the given modifier is final. - * @param mod the modifier. - * @return <code>true</code> if final, <code>false</code> otherwise. - */ - public static boolean isFinal(int mod) - { - return (mod & FINAL) != 0; - } - - /** - * Check whether the given modifier is an interface. - * @param mod the modifier. - * @return <code>true</code> if an interface, <code>false</code> otherwise. - */ - public static boolean isInterface(int mod) - { - return (mod & INTERFACE) != 0; - } - - /** - * Check whether the given modifier is native. - * @param mod the modifier. - * @return <code>true</code> if native, <code>false</code> otherwise. - */ - public static boolean isNative(int mod) - { - return (mod & NATIVE) != 0; - } - - /** - * Check whether the given modifier is private. - * @param mod the modifier. - * @return <code>true</code> if private, <code>false</code> otherwise. - */ - public static boolean isPrivate(int mod) - { - return (mod & PRIVATE) != 0; - } - - /** - * Check whether the given modifier is protected. - * @param mod the modifier. - * @return <code>true</code> if protected, <code>false</code> otherwise. - */ - public static boolean isProtected(int mod) - { - return (mod & PROTECTED) != 0; - } - - /** - * Check whether the given modifier is public. - * @param mod the modifier. - * @return <code>true</code> if public, <code>false</code> otherwise. - */ - public static boolean isPublic(int mod) - { - return (mod & PUBLIC) != 0; - } - - /** - * Check whether the given modifier is static. - * @param mod the modifier. - * @return <code>true</code> if static, <code>false</code> otherwise. - */ - public static boolean isStatic(int mod) - { - return (mod & STATIC) != 0; - } - - /** - * Check whether the given modifier is strictfp. - * @param mod the modifier. - * @return <code>true</code> if strictfp, <code>false</code> otherwise. - */ - public static boolean isStrict(int mod) - { - return (mod & STRICT) != 0; - } - - /** - * Check whether the given modifier is synchronized. - * @param mod the modifier. - * @return <code>true</code> if synchronized, <code>false</code> otherwise. - */ - public static boolean isSynchronized(int mod) - { - return (mod & SYNCHRONIZED) != 0; - } - - /** - * Check whether the given modifier is transient. - * @param mod the modifier. - * @return <code>true</code> if transient, <code>false</code> otherwise. - */ - public static boolean isTransient(int mod) - { - return (mod & TRANSIENT) != 0; - } - - /** - * Check whether the given modifier is volatile. - * @param mod the modifier. - * @return <code>true</code> if volatile, <code>false</code> otherwise. - */ - public static boolean isVolatile(int mod) - { - return (mod & VOLATILE) != 0; - } - - /** - * @since 1.7 - */ - public static int classModifiers() - { - return PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | STRICT; - } - - /** - * @since 1.7 - */ - public static int interfaceModifiers() - { - return PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | STRICT; - } - - /** - * @since 1.7 - */ - public static int constructorModifiers() - { - return PUBLIC | PROTECTED | PRIVATE; - } - - /** - * @since 1.7 - */ - public static int methodModifiers() - { - return PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | STRICT | SYNCHRONIZED | NATIVE; - } - - /** - * @since 1.7 - */ - public static int fieldModifiers() - { - return PUBLIC | PROTECTED | PRIVATE | STATIC | FINAL | TRANSIENT | VOLATILE; - } - - /** - * Get a string representation of all the modifiers represented by the - * given int. The keywords are printed in this order: - * <code><public|protected|private> abstract static final transient - * volatile synchronized native strictfp interface</code>. - * - * @param mod the modifier. - * @return the String representing the modifiers. - */ - public static String toString(int mod) - { - return toString(mod, new CPStringBuilder()).toString(); - } - - /** - * Package helper method that can take a CPStringBuilder. - * @param mod the modifier - * @param r the CPStringBuilder to which the String representation is appended - * @return r, with information appended - */ - static CPStringBuilder toString(int mod, CPStringBuilder r) - { - if (isPublic(mod)) - r.append("public "); - if (isProtected(mod)) - r.append("protected "); - if (isPrivate(mod)) - r.append("private "); - if (isAbstract(mod)) - r.append("abstract "); - if (isStatic(mod)) - r.append("static "); - if (isFinal(mod)) - r.append("final "); - if (isTransient(mod)) - r.append("transient "); - if (isVolatile(mod)) - r.append("volatile "); - if (isSynchronized(mod)) - r.append("synchronized "); - if (isNative(mod)) - r.append("native "); - if (isStrict(mod)) - r.append("strictfp "); - if (isInterface(mod)) - r.append("interface "); - - // Trim trailing space. - if ((mod & ALL_FLAGS) != 0) - r.setLength(r.length() - 1); - return r; - } -} diff --git a/libjava/classpath/java/lang/reflect/ParameterizedType.java b/libjava/classpath/java/lang/reflect/ParameterizedType.java deleted file mode 100644 index 7a8a7b4..0000000 --- a/libjava/classpath/java/lang/reflect/ParameterizedType.java +++ /dev/null @@ -1,122 +0,0 @@ -/* ParameterizedType.java -- Represents parameterized types e.g. List<String> - Copyright (C) 2004, 2005 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; - -/** - * <p> - * Represents a type which is parameterized over one or more other - * types. For example, <code>List<Integer></code> is a parameterized - * type, with <code>List</code> parameterized over the type - * <code>Integer</code>. - * </p> - * <p> - * Instances of this classes are created as needed, during reflection. - * On creating a parameterized type, <code>p</code>, the - * <code>GenericTypeDeclaration</code> corresponding to <code>p</code> - * is created and resolved. Each type argument of <code>p</code> - * is then created recursively; details of this process are availble - * in the documentation of <code>TypeVariable</code>. This creation - * process only happens once; repetition has no effect. - * </p> - * <p> - * Implementors of this interface must implement an appropriate - * <code>equals()</code> method. This method should equate any - * two instances of the implementing class that have the same - * <code>GenericTypeDeclaration</code> and <code>Type</code> - * parameters. - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @see GenericDeclaration - * @see TypeVariable - * @since 1.5 - */ -public interface ParameterizedType - extends Type -{ - - /** - * <p> - * Returns an array of <code>Type</code> objects, which gives - * the parameters of this type. - * </p> - * <p> - * <strong>Note</code>: the returned array may be empty. This - * occurs if the supposed <code>ParameterizedType</code> is simply - * a normal type wrapped inside a parameterized type. - * </p> - * - * @return an array of <code>Type</code>s, representing the arguments - * of this type. - * @throws TypeNotPresentException if any of the types referred to by - * the parameters of this type do not actually exist. - * @throws MalformedParameterizedTypeException if any of the types - * refer to a type which can not be instantiated. - */ - Type[] getActualTypeArguments(); - - /** - * Returns the type of which this type is a member. For example, - * in <code>Top<String>.Bottom<Integer></code>, - * <code>Bottom<Integer></code> is a member of - * <code>Top<String></code>, and so the latter is returned - * by this method. Calling this method on top-level types (such as - * <code>Top<String></code>) returns null. - * - * @return the type which owns this type. - * @throws TypeNotPresentException if the owner type referred to by - * this type do not actually exist. - * @throws MalformedParameterizedTypeException if the owner type - * referred to by this type can not be instantiated. - */ - Type getOwnerType(); - - /** - * Returns a version of this type without parameters, which corresponds - * to the class or interface which declared the type. For example, - * the raw type corresponding to <code>List<Double></code> - * is <code>List</code>, which was declared by the <code>List</code> - * class. - * - * @return the raw variant of this type (i.e. the type without - * parameters). - */ - Type getRawType(); - -} diff --git a/libjava/classpath/java/lang/reflect/Proxy.java b/libjava/classpath/java/lang/reflect/Proxy.java deleted file mode 100644 index 0e76124..0000000 --- a/libjava/classpath/java/lang/reflect/Proxy.java +++ /dev/null @@ -1,1545 +0,0 @@ -/* Proxy.java -- build a proxy class that implements reflected interfaces - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 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; - -import gnu.java.lang.CPStringBuilder; - -import gnu.java.lang.reflect.TypeSignature; - -import java.io.Serializable; -import java.security.ProtectionDomain; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -/** - * This class allows you to dynamically create an instance of any (or - * even multiple) interfaces by reflection, and decide at runtime - * how that instance will behave by giving it an appropriate - * {@link InvocationHandler}. Proxy classes serialize specially, so - * that the proxy object can be reused between VMs, without requiring - * a persistent copy of the generated class code. - * - * <h3>Creation</h3> - * To create a proxy for some interface Foo: - * - * <pre> - * InvocationHandler handler = new MyInvocationHandler(...); - * Class proxyClass = Proxy.getProxyClass( - * Foo.class.getClassLoader(), new Class[] { Foo.class }); - * Foo f = (Foo) proxyClass - * .getConstructor(new Class[] { InvocationHandler.class }) - * .newInstance(new Object[] { handler }); - * </pre> - * or more simply: - * <pre> - * Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), - * new Class[] { Foo.class }, - * handler); - * </pre> - * - * <h3>Dynamic Proxy Classes</h3> - * A dynamic proxy class is created at runtime, and has the following - * properties: - * <ul> - * <li>The class is <code>public</code> and <code>final</code>, - * and is neither <code>abstract</code> nor an inner class.</li> - * <li>The class has no canonical name (there is no formula you can use - * to determine or generate its name), but begins with the - * sequence "$Proxy". Abuse this knowledge at your own peril. - * (For now, '$' in user identifiers is legal, but it may not - * be that way forever. You weren't using '$' in your - * identifiers, were you?)</li> - * <li>The class extends Proxy, and explicitly implements all the - * interfaces specified at creation, in order (this is important - * for determining how method invocation is resolved). Note that - * a proxy class implements {@link Serializable}, at least - * implicitly, since Proxy does, but true serial behavior - * depends on using a serializable invocation handler as well.</li> - * <li>If at least one interface is non-public, the proxy class - * will be in the same package. Otherwise, the package is - * unspecified. This will work even if the package is sealed - * from user-generated classes, because Proxy classes are - * generated by a trusted source. Meanwhile, the proxy class - * belongs to the classloader you designated.</li> - * <li>Reflection works as expected: {@link Class#getInterfaces()} and - * {@link Class#getMethods()} work as they do on normal classes.</li> - * <li>The method {@link #isProxyClass(Class)} will distinguish between - * true proxy classes and user extensions of this class. It only - * returns true for classes created by {@link #getProxyClass}.</li> - * <li>The {@link ProtectionDomain} of a proxy class is the same as for - * bootstrap classes, such as Object or Proxy, since it is created by - * a trusted source. This protection domain will typically be granted - * {@link java.security.AllPermission}. But this is not a security - * risk, since there are adequate permissions on reflection, which is - * the only way to create an instance of the proxy class.</li> - * <li>The proxy class contains a single constructor, which takes as - * its only argument an {@link InvocationHandler}. The method - * {@link #newProxyInstance(ClassLoader, Class[], InvocationHandler)} - * is shorthand to do the necessary reflection.</li> - * </ul> - * - * <h3>Proxy Instances</h3> - * A proxy instance is an instance of a proxy class. It has the - * following properties, many of which follow from the properties of a - * proxy class listed above: - * <ul> - * <li>For a proxy class with Foo listed as one of its interfaces, the - * expression <code>proxy instanceof Foo</code> will return true, - * and the expression <code>(Foo) proxy</code> will succeed without - * a {@link ClassCastException}.</li> - * <li>Each proxy instance has an invocation handler, which can be - * accessed by {@link #getInvocationHandler(Object)}. Any call - * to an interface method, including {@link Object#hashCode()}, - * {@link Object#equals(Object)}, or {@link Object#toString()}, - * but excluding the public final methods of Object, will be - * encoded and passed to the {@link InvocationHandler#invoke} - * method of this handler.</li> - * </ul> - * - * <h3>Inheritance Issues</h3> - * A proxy class may inherit a method from more than one interface. - * The order in which interfaces are listed matters, because it determines - * which reflected {@link Method} object will be passed to the invocation - * handler. This means that the dynamically generated class cannot - * determine through which interface a method is being invoked.<p> - * - * In short, if a method is declared in Object (namely, hashCode, - * equals, or toString), then Object will be used; otherwise, the - * leftmost interface that inherits or declares a method will be used, - * even if it has a more permissive throws clause than what the proxy - * class is allowed. Thus, in the invocation handler, it is not always - * safe to assume that every class listed in the throws clause of the - * passed Method object can safely be thrown; fortunately, the Proxy - * instance is robust enough to wrap all illegal checked exceptions in - * {@link UndeclaredThrowableException}. - * - * @see InvocationHandler - * @see UndeclaredThrowableException - * @see Class - * @author Eric Blake (ebb9@email.byu.edu) - * @since 1.3 - * @status updated to 1.5, except for the use of ProtectionDomain - */ -public class Proxy implements Serializable -{ - /** - * Compatible with JDK 1.3+. - */ - private static final long serialVersionUID = -2222568056686623797L; - - /** - * Map of ProxyType to proxy class. - * - * @XXX This prevents proxy classes from being garbage collected. - * java.util.WeakHashSet is not appropriate, because that collects the - * keys, but we are interested in collecting the elements. - */ - private static final Map proxyClasses = new HashMap(); - - /** - * The invocation handler for this proxy instance. For Proxy, this - * field is unused, but it appears here in order to be serialized in all - * proxy classes. - * - * <em>NOTE</em>: This implementation is more secure for proxy classes - * than what Sun specifies. Sun does not require h to be immutable, but - * this means you could change h after the fact by reflection. However, - * by making h immutable, we may break non-proxy classes which extend - * Proxy. - * @serial invocation handler associated with this proxy instance - */ - protected InvocationHandler h; - - /** - * Constructs a new Proxy from a subclass (usually a proxy class), - * with the specified invocation handler. - * - * <em>NOTE</em>: This throws a NullPointerException if you attempt - * to create a proxy instance with a null handler using reflection. - * This behavior is not yet specified by Sun; see Sun Bug 4487672. - * - * @param handler the invocation handler, may be null if the subclass - * is not a proxy class - * @throws NullPointerException if handler is null and this is a proxy - * instance - */ - protected Proxy(InvocationHandler handler) - { - if (handler == null && isProxyClass(getClass())) - throw new NullPointerException("invalid handler"); - h = handler; - } - - /** - * Returns the proxy {@link Class} for the given ClassLoader and array - * of interfaces, dynamically generating it if necessary. - * - * <p>There are several restrictions on this method, the violation of - * which will result in an IllegalArgumentException or - * NullPointerException:</p> - * - * <ul> - * <li>All objects in `interfaces' must represent distinct interfaces. - * Classes, primitive types, null, and duplicates are forbidden.</li> - * <li>The interfaces must be visible in the specified ClassLoader. - * In other words, for each interface i: - * <code>Class.forName(i.getName(), false, loader) == i</code> - * must be true.</li> - * <li>All non-public interfaces (if any) must reside in the same - * package, or the proxy class would be non-instantiable. If - * there are no non-public interfaces, the package of the proxy - * class is unspecified.</li> - * <li>All interfaces must be compatible - if two declare a method - * with the same name and parameters, the return type must be - * the same and the throws clause of the proxy class will be - * the maximal subset of subclasses of the throws clauses for - * each method that is overridden.</li> - * <li>VM constraints limit the number of interfaces a proxy class - * may directly implement (however, the indirect inheritance - * of {@link Serializable} does not count against this limit). - * Even though most VMs can theoretically have 65535 - * superinterfaces for a class, the actual limit is smaller - * because a class's constant pool is limited to 65535 entries, - * and not all entries can be interfaces.</li> - * </ul> - * - * <p>Note that different orders of interfaces produce distinct classes.</p> - * - * @param loader the class loader to define the proxy class in; null - * implies the bootstrap class loader - * @param interfaces the array of interfaces the proxy class implements, - * may be empty, but not null - * @return the Class object of the proxy class - * @throws IllegalArgumentException if the constraints above were - * violated, except for problems with null - * @throws NullPointerException if `interfaces' is null or contains - * a null entry - */ - // synchronized so that we aren't trying to build the same class - // simultaneously in two threads - public static synchronized Class<?> getProxyClass(ClassLoader loader, - Class<?>... interfaces) - { - interfaces = (Class[]) interfaces.clone(); - ProxyType pt = new ProxyType(loader, interfaces); - Class clazz = (Class) proxyClasses.get(pt); - if (clazz == null) - { - if (VMProxy.HAVE_NATIVE_GET_PROXY_CLASS) - clazz = VMProxy.getProxyClass(loader, interfaces); - else - { - ProxyData data = (VMProxy.HAVE_NATIVE_GET_PROXY_DATA - ? VMProxy.getProxyData(loader, interfaces) - : ProxyData.getProxyData(pt)); - - clazz = (VMProxy.HAVE_NATIVE_GENERATE_PROXY_CLASS - ? VMProxy.generateProxyClass(loader, data) - : new ClassFactory(data).generate(loader)); - } - - Object check = proxyClasses.put(pt, clazz); - // assert check == null && clazz != null; - if (check != null || clazz == null) - throw new InternalError(/*"Fatal flaw in getProxyClass"*/); - } - return clazz; - } - - /** - * Combines several methods into one. This is equivalent to: - * <pre> - * Proxy.getProxyClass(loader, interfaces) - * .getConstructor(new Class[] {InvocationHandler.class}) - * .newInstance(new Object[] {handler}); - * </pre> - * except that it will not fail with the normal problems caused - * by reflection. It can still fail for the same reasons documented - * in getProxyClass, or if handler is null. - * - * @param loader the class loader to define the proxy class in; null - * implies the bootstrap class loader - * @param interfaces the array of interfaces the proxy class implements, - * may be empty, but not null - * @param handler the invocation handler, may not be null - * @return a proxy instance implementing the specified interfaces - * @throws IllegalArgumentException if the constraints for getProxyClass - * were violated, except for problems with null - * @throws NullPointerException if `interfaces' is null or contains - * a null entry, or if handler is null - * @see #getProxyClass(ClassLoader, Class[]) - * @see Class#getConstructor(Class[]) - * @see Constructor#newInstance(Object[]) - */ - public static Object newProxyInstance(ClassLoader loader, - Class<?>[] interfaces, - InvocationHandler handler) - { - try - { - // getProxyClass() and Proxy() throw the necessary exceptions - return getProxyClass(loader, interfaces) - .getConstructor(new Class[] {InvocationHandler.class}) - .newInstance(new Object[] {handler}); - } - catch (RuntimeException e) - { - // Let IllegalArgumentException, NullPointerException escape. - // assert e instanceof IllegalArgumentException - // || e instanceof NullPointerException; - throw e; - } - catch (InvocationTargetException e) - { - // Let wrapped NullPointerException escape. - // assert e.getTargetException() instanceof NullPointerException - throw (NullPointerException) e.getCause(); - } - catch (Exception e) - { - // Covers InstantiationException, IllegalAccessException, - // NoSuchMethodException, none of which should be generated - // if the proxy class was generated correctly. - // assert false; - throw (Error) new InternalError("Unexpected: " + e).initCause(e); - } - } - - /** - * Returns true if and only if the Class object is a dynamically created - * proxy class (created by <code>getProxyClass</code> or by the - * syntactic sugar of <code>newProxyInstance</code>). - * - * <p>This check is secure (in other words, it is not simply - * <code>clazz.getSuperclass() == Proxy.class</code>), it will not - * be spoofed by non-proxy classes that extend Proxy. - * - * @param clazz the class to check, must not be null - * @return true if the class represents a proxy class - * @throws NullPointerException if clazz is null - */ - // This is synchronized on the off chance that another thread is - // trying to add a class to the map at the same time we read it. - public static synchronized boolean isProxyClass(Class<?> clazz) - { - if (! Proxy.class.isAssignableFrom(clazz)) - return false; - // This is a linear search, even though we could do an O(1) search - // using new ProxyType(clazz.getClassLoader(), clazz.getInterfaces()). - return proxyClasses.containsValue(clazz); - } - - /** - * Returns the invocation handler for the given proxy instance.<p> - * - * <em>NOTE</em>: We guarantee a non-null result if successful, - * but Sun allows the creation of a proxy instance with a null - * handler. See the comments for {@link #Proxy(InvocationHandler)}. - * - * @param proxy the proxy instance, must not be null - * @return the invocation handler, guaranteed non-null. - * @throws IllegalArgumentException if - * <code>Proxy.isProxyClass(proxy.getClass())</code> returns false. - * @throws NullPointerException if proxy is null - */ - public static InvocationHandler getInvocationHandler(Object proxy) - { - if (! isProxyClass(proxy.getClass())) - throw new IllegalArgumentException("not a proxy instance"); - return ((Proxy) proxy).h; - } - - /** - * Helper class for mapping unique ClassLoader and interface combinations - * to proxy classes. - * - * @author Eric Blake (ebb9@email.byu.edu) - */ - private static final class ProxyType - { - /** - * Store the class loader (may be null) - */ - final ClassLoader loader; - - /** - * Store the interfaces (never null, all elements are interfaces) - */ - final Class[] interfaces; - - /** - * Construct the helper object. - * - * @param loader the class loader to define the proxy class in; null - * implies the bootstrap class loader - * @param interfaces an array of interfaces - */ - ProxyType(ClassLoader loader, Class[] interfaces) - { - this.loader = loader; - this.interfaces = interfaces; - } - - /** - * Calculates the hash code. - * - * @return a combination of the classloader and interfaces hashcodes. - */ - public int hashCode() - { - int hash = loader == null ? 0 : loader.hashCode(); - for (int i = 0; i < interfaces.length; i++) - hash = hash * 31 + interfaces[i].hashCode(); - return hash; - } - - /** - * Calculates equality. - * - * @param other object to compare to - * @return true if it is a ProxyType with same data - */ - public boolean equals(Object other) - { - ProxyType pt = (ProxyType) other; - if (loader != pt.loader || interfaces.length != pt.interfaces.length) - return false; - for (int i = 0; i < interfaces.length; i++) - if (interfaces[i] != pt.interfaces[i]) - return false; - return true; - } - } // class ProxyType - - /** - * Helper class which allows hashing of a method name and signature - * without worrying about return type, declaring class, or throws clause, - * and which reduces the maximally common throws clause between two methods - * - * @author Eric Blake (ebb9@email.byu.edu) - */ - private static final class ProxySignature - { - /** - * The core signatures which all Proxy instances handle. - */ - static final HashMap coreMethods = new HashMap(); - static - { - try - { - ProxySignature sig - = new ProxySignature(Object.class - .getMethod("equals", - new Class[] {Object.class})); - coreMethods.put(sig, sig); - sig = new ProxySignature(Object.class.getMethod("hashCode")); - coreMethods.put(sig, sig); - sig = new ProxySignature(Object.class.getMethod("toString")); - coreMethods.put(sig, sig); - } - catch (Exception e) - { - // assert false; - throw (Error) new InternalError("Unexpected: " + e).initCause(e); - } - } - - /** - * The underlying Method object, never null - */ - final Method method; - - /** - * The set of compatible thrown exceptions, may be empty - */ - final Set exceptions = new HashSet(); - - /** - * Construct a signature - * - * @param method the Method this signature is based on, never null - */ - ProxySignature(Method method) - { - this.method = method; - Class[] exc = method.getExceptionTypes(); - int i = exc.length; - while (--i >= 0) - { - // discard unchecked exceptions - if (Error.class.isAssignableFrom(exc[i]) - || RuntimeException.class.isAssignableFrom(exc[i])) - continue; - exceptions.add(exc[i]); - } - } - - /** - * Given a method, make sure it's return type is identical - * to this, and adjust this signature's throws clause appropriately - * - * @param other the signature to merge in - * @throws IllegalArgumentException if the return types conflict - */ - void checkCompatibility(ProxySignature other) - { - if (method.getReturnType() != other.method.getReturnType()) - throw new IllegalArgumentException("incompatible return types: " - + method + ", " + other.method); - - // if you can think of a more efficient way than this O(n^2) search, - // implement it! - int size1 = exceptions.size(); - int size2 = other.exceptions.size(); - boolean[] valid1 = new boolean[size1]; - boolean[] valid2 = new boolean[size2]; - Iterator itr = exceptions.iterator(); - int pos = size1; - while (--pos >= 0) - { - Class c1 = (Class) itr.next(); - Iterator itr2 = other.exceptions.iterator(); - int pos2 = size2; - while (--pos2 >= 0) - { - Class c2 = (Class) itr2.next(); - if (c2.isAssignableFrom(c1)) - valid1[pos] = true; - if (c1.isAssignableFrom(c2)) - valid2[pos2] = true; - } - } - pos = size1; - itr = exceptions.iterator(); - while (--pos >= 0) - { - itr.next(); - if (! valid1[pos]) - itr.remove(); - } - pos = size2; - itr = other.exceptions.iterator(); - while (--pos >= 0) - { - itr.next(); - if (! valid2[pos]) - itr.remove(); - } - exceptions.addAll(other.exceptions); - } - - /** - * Calculates the hash code. - * - * @return a combination of name and parameter types - */ - public int hashCode() - { - int hash = method.getName().hashCode(); - Class[] types = method.getParameterTypes(); - for (int i = 0; i < types.length; i++) - hash = hash * 31 + types[i].hashCode(); - return hash; - } - - /** - * Calculates equality. - * - * @param other object to compare to - * @return true if it is a ProxySignature with same data - */ - public boolean equals(Object other) - { - ProxySignature ps = (ProxySignature) other; - Class[] types1 = method.getParameterTypes(); - Class[] types2 = ps.method.getParameterTypes(); - if (! method.getName().equals(ps.method.getName()) - || types1.length != types2.length) - return false; - int i = types1.length; - while (--i >= 0) - if (types1[i] != types2[i]) - return false; - return true; - } - } // class ProxySignature - - /** - * A flat representation of all data needed to generate bytecode/instantiate - * a proxy class. This is basically a struct. - * - * @author Eric Blake (ebb9@email.byu.edu) - */ - static final class ProxyData - { - /** - * The package this class is in <b>including the trailing dot</b> - * or an empty string for the unnamed (aka default) package. - */ - String pack = ""; - - /** - * The interfaces this class implements. Non-null, but possibly empty. - */ - Class[] interfaces; - - /** - * The Method objects this class must pass as the second argument to - * invoke (also useful for determining what methods this class has). - * Non-null, non-empty (includes at least Object.hashCode, Object.equals, - * and Object.toString). - */ - Method[] methods; - - /** - * The exceptions that do not need to be wrapped in - * UndeclaredThrowableException. exceptions[i] is the same as, or a - * subset of subclasses, of methods[i].getExceptionTypes(), depending on - * compatible throws clauses with multiple inheritance. It is unspecified - * if these lists include or exclude subclasses of Error and - * RuntimeException, but excluding them is harmless and generates a - * smaller class. - */ - Class[][] exceptions; - - /** - * For unique id's - */ - private static int count; - - /** - * The id of this proxy class - */ - final int id = count++; - - /** - * Construct a ProxyData with uninitialized data members. - */ - ProxyData() - { - } - - /** - * Return the name of a package (including the trailing dot) - * given the name of a class. - * Returns an empty string if no package. We use this in preference to - * using Class.getPackage() to avoid problems with ClassLoaders - * that don't set the package. - */ - private static String getPackage(Class k) - { - String name = k.getName(); - int idx = name.lastIndexOf('.'); - return name.substring(0, idx + 1); - } - - /** - * Verifies that the arguments are legal, and sets up remaining data - * This should only be called when a class must be generated, as - * it is expensive. - * - * @param pt the ProxyType to convert to ProxyData - * @return the flattened, verified ProxyData structure for use in - * class generation - * @throws IllegalArgumentException if `interfaces' contains - * non-interfaces or incompatible combinations, and verify is true - * @throws NullPointerException if interfaces is null or contains null - */ - static ProxyData getProxyData(ProxyType pt) - { - Map method_set = (Map) ProxySignature.coreMethods.clone(); - boolean in_package = false; // true if we encounter non-public interface - - ProxyData data = new ProxyData(); - data.interfaces = pt.interfaces; - - // if interfaces is too large, we croak later on when the constant - // pool overflows - int i = data.interfaces.length; - while (--i >= 0) - { - Class inter = data.interfaces[i]; - if (! inter.isInterface()) - throw new IllegalArgumentException("not an interface: " + inter); - try - { - if (Class.forName(inter.getName(), false, pt.loader) != inter) - throw new IllegalArgumentException("not accessible in " - + "classloader: " + inter); - } - catch (ClassNotFoundException e) - { - throw new IllegalArgumentException("not accessible in " - + "classloader: " + inter); - } - if (! Modifier.isPublic(inter.getModifiers())) - if (in_package) - { - String p = getPackage(inter); - if (! data.pack.equals(p)) - throw new IllegalArgumentException("non-public interfaces " - + "from different " - + "packages"); - } - else - { - in_package = true; - data.pack = getPackage(inter); - } - for (int j = i-1; j >= 0; j--) - if (data.interfaces[j] == inter) - throw new IllegalArgumentException("duplicate interface: " - + inter); - Method[] methods = inter.getMethods(); - int j = methods.length; - while (--j >= 0) - { - if (isCoreObjectMethod(methods[j])) - { - // In the case of an attempt to redefine a public non-final - // method of Object, we must skip it - continue; - } - ProxySignature sig = new ProxySignature(methods[j]); - ProxySignature old = (ProxySignature) method_set.put(sig, sig); - if (old != null) - sig.checkCompatibility(old); - } - } - - i = method_set.size(); - data.methods = new Method[i]; - data.exceptions = new Class[i][]; - Iterator itr = method_set.values().iterator(); - while (--i >= 0) - { - ProxySignature sig = (ProxySignature) itr.next(); - data.methods[i] = sig.method; - data.exceptions[i] = (Class[]) sig.exceptions - .toArray(new Class[sig.exceptions.size()]); - } - return data; - } - - /** - * Checks whether the method is similar to a public non-final method of - * Object or not (i.e. with the same name and parameter types). Note that we - * can't rely, directly or indirectly (via Collection.contains) on - * Method.equals as it would also check the declaring class, what we do not - * want. We only want to check that the given method have the same signature - * as a core method (same name and parameter types) - * - * @param method the method to check - * @return whether the method has the same name and parameter types as - * Object.equals, Object.hashCode or Object.toString - * @see java.lang.Object#equals(Object) - * @see java.lang.Object#hashCode() - * @see java.lang.Object#toString() - */ - private static boolean isCoreObjectMethod(Method method) - { - String methodName = method.getName(); - if (methodName.equals("equals")) - { - return Arrays.equals(method.getParameterTypes(), - new Class[] { Object.class }); - } - if (methodName.equals("hashCode")) - { - return method.getParameterTypes().length == 0; - } - if (methodName.equals("toString")) - { - return method.getParameterTypes().length == 0; - } - return false; - } - - } // class ProxyData - - /** - * Does all the work of building a class. By making this a nested class, - * this code is not loaded in memory if the VM has a native - * implementation instead. - * - * @author Eric Blake (ebb9@email.byu.edu) - */ - private static final class ClassFactory - { - /** Constants for assisting the compilation */ - private static final byte FIELD = 1; - private static final byte METHOD = 2; - private static final byte INTERFACE = 3; - private static final String CTOR_SIG - = "(Ljava/lang/reflect/InvocationHandler;)V"; - private static final String INVOKE_SIG = "(Ljava/lang/Object;" - + "Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;"; - - /** Bytecodes for insertion in the class definition byte[] */ - private static final char ACONST_NULL = 1; - private static final char ICONST_0 = 3; - private static final char BIPUSH = 16; - private static final char SIPUSH = 17; - private static final char ILOAD = 21; - private static final char ILOAD_0 = 26; - private static final char ALOAD_0 = 42; - private static final char ALOAD_1 = 43; - private static final char AALOAD = 50; - private static final char AASTORE = 83; - private static final char DUP = 89; - private static final char DUP_X1 = 90; - private static final char SWAP = 95; - private static final char IRETURN = 172; - private static final char LRETURN = 173; - private static final char FRETURN = 174; - private static final char DRETURN = 175; - private static final char ARETURN = 176; - private static final char RETURN = 177; - private static final char GETSTATIC = 178; - private static final char GETFIELD = 180; - private static final char INVOKEVIRTUAL = 182; - private static final char INVOKESPECIAL = 183; - private static final char INVOKEINTERFACE = 185; - private static final char NEW = 187; - private static final char ANEWARRAY = 189; - private static final char ATHROW = 191; - private static final char CHECKCAST = 192; - - // Implementation note: we use StringBuffers to hold the byte data, since - // they automatically grow. However, we only use the low 8 bits of - // every char in the array, so we are using twice the necessary memory - // for the ease StringBuffer provides. - - /** The constant pool. */ - private final StringBuffer pool = new StringBuffer(); - /** The rest of the class data. */ - private final StringBuffer stream = new StringBuffer(); - - /** Map of strings to byte sequences, to minimize size of pool. */ - private final Map poolEntries = new HashMap(); - - /** The VM name of this proxy class. */ - private final String qualName; - - /** - * The Method objects the proxy class refers to when calling the - * invocation handler. - */ - private final Method[] methods; - - /** - * Initializes the buffers with the bytecode contents for a proxy class. - * - * @param data the remainder of the class data - * @throws IllegalArgumentException if anything else goes wrong this - * late in the game; as far as I can tell, this will only happen - * if the constant pool overflows, which is possible even when - * the user doesn't exceed the 65535 interface limit - */ - ClassFactory(ProxyData data) - { - methods = data.methods; - - // magic = 0xcafebabe - // minor_version = 0 - // major_version = 46 - // constant_pool_count: place-holder for now - pool.append("\u00ca\u00fe\u00ba\u00be\0\0\0\56\0\0"); - // constant_pool[], filled in as we go - - // access_flags - putU2(Modifier.SUPER | Modifier.FINAL | Modifier.PUBLIC); - // this_class - qualName = (data.pack + "$Proxy" + data.id); - putU2(classInfo(TypeSignature.getEncodingOfClass(qualName, false))); - // super_class - putU2(classInfo("java/lang/reflect/Proxy")); - - // interfaces_count - putU2(data.interfaces.length); - // interfaces[] - for (int i = 0; i < data.interfaces.length; i++) - putU2(classInfo(data.interfaces[i])); - - // Recall that Proxy classes serialize specially, so we do not need - // to worry about a <clinit> method for this field. Instead, we - // just assign it by reflection after the class is successfully loaded. - // fields_count - private static Method[] m; - putU2(1); - // fields[] - // m.access_flags - putU2(Modifier.PRIVATE | Modifier.STATIC); - // m.name_index - putU2(utf8Info("m")); - // m.descriptor_index - putU2(utf8Info("[Ljava/lang/reflect/Method;")); - // m.attributes_count - putU2(0); - // m.attributes[] - - // methods_count - # handler methods, plus <init> - putU2(methods.length + 1); - // methods[] - // <init>.access_flags - putU2(Modifier.PUBLIC); - // <init>.name_index - putU2(utf8Info("<init>")); - // <init>.descriptor_index - putU2(utf8Info(CTOR_SIG)); - // <init>.attributes_count - only Code is needed - putU2(1); - // <init>.Code.attribute_name_index - putU2(utf8Info("Code")); - // <init>.Code.attribute_length = 18 - // <init>.Code.info: - // $Proxynn(InvocationHandler h) { super(h); } - // <init>.Code.max_stack = 2 - // <init>.Code.max_locals = 2 - // <init>.Code.code_length = 6 - // <init>.Code.code[] - stream.append("\0\0\0\22\0\2\0\2\0\0\0\6" + ALOAD_0 + ALOAD_1 - + INVOKESPECIAL); - putU2(refInfo(METHOD, "java/lang/reflect/Proxy", "<init>", CTOR_SIG)); - // <init>.Code.exception_table_length = 0 - // <init>.Code.exception_table[] - // <init>.Code.attributes_count = 0 - // <init>.Code.attributes[] - stream.append(RETURN + "\0\0\0\0"); - - for (int i = methods.length - 1; i >= 0; i--) - emitMethod(i, data.exceptions[i]); - - // attributes_count - putU2(0); - // attributes[] - empty; omit SourceFile attribute - // XXX should we mark this with a Synthetic attribute? - } - - /** - * Produce the bytecode for a single method. - * - * @param i the index of the method we are building - * @param e the exceptions possible for the method - */ - private void emitMethod(int i, Class[] e) - { - // First, we precalculate the method length and other information. - - Method m = methods[i]; - Class[] paramtypes = m.getParameterTypes(); - int wrap_overhead = 0; // max words taken by wrapped primitive - int param_count = 1; // 1 for this - int code_length = 16; // aload_0, getfield, aload_0, getstatic, const, - // aaload, const/aconst_null, invokeinterface - if (i > 5) - { - if (i > Byte.MAX_VALUE) - code_length += 2; // sipush - else - code_length++; // bipush - } - if (paramtypes.length > 0) - { - code_length += 3; // anewarray - if (paramtypes.length > Byte.MAX_VALUE) - code_length += 2; // sipush - else if (paramtypes.length > 5) - code_length++; // bipush - for (int j = 0; j < paramtypes.length; j++) - { - code_length += 4; // dup, const, load, store - Class type = paramtypes[j]; - if (j > 5) - { - if (j > Byte.MAX_VALUE) - code_length += 2; // sipush - else - code_length++; // bipush - } - if (param_count >= 4) - code_length++; // 2-byte load - param_count++; - if (type.isPrimitive()) - { - code_length += 7; // new, dup, invokespecial - if (type == long.class || type == double.class) - { - wrap_overhead = 3; - param_count++; - } - else if (wrap_overhead < 2) - wrap_overhead = 2; - } - } - } - int end_pc = code_length; - Class ret_type = m.getReturnType(); - if (ret_type == void.class) - code_length++; // return - else if (ret_type.isPrimitive()) - code_length += 7; // cast, invokevirtual, return - else - code_length += 4; // cast, return - int exception_count = 0; - boolean throws_throwable = false; - for (int j = 0; j < e.length; j++) - if (e[j] == Throwable.class) - { - throws_throwable = true; - break; - } - if (! throws_throwable) - { - exception_count = e.length + 3; // Throwable, Error, RuntimeException - code_length += 9; // new, dup_x1, swap, invokespecial, athrow - } - int handler_pc = code_length - 1; - CPStringBuilder signature = new CPStringBuilder("("); - for (int j = 0; j < paramtypes.length; j++) - signature.append(TypeSignature.getEncodingOfClass(paramtypes[j])); - signature.append(")").append(TypeSignature.getEncodingOfClass(ret_type)); - - // Now we have enough information to emit the method. - - // handler.access_flags - putU2(Modifier.PUBLIC | Modifier.FINAL); - // handler.name_index - putU2(utf8Info(m.getName())); - // handler.descriptor_index - putU2(utf8Info(signature.toString())); - // handler.attributes_count - Code is necessary, Exceptions possible - putU2(e.length > 0 ? 2 : 1); - - // handler.Code.info: - // type name(args) { - // try { - // return (type) h.invoke(this, methods[i], new Object[] {args}); - // } catch (<declared Exceptions> e) { - // throw e; - // } catch (Throwable t) { - // throw new UndeclaredThrowableException(t); - // } - // } - // Special cases: - // if arg_n is primitive, wrap it - // if method throws Throwable, try-catch is not needed - // if method returns void, return statement not needed - // if method returns primitive, unwrap it - // save space by sharing code for all the declared handlers - - // handler.Code.attribute_name_index - putU2(utf8Info("Code")); - // handler.Code.attribute_length - putU4(12 + code_length + 8 * exception_count); - // handler.Code.max_stack - putU2(param_count == 1 ? 4 : 7 + wrap_overhead); - // handler.Code.max_locals - putU2(param_count); - // handler.Code.code_length - putU4(code_length); - // handler.Code.code[] - putU1(ALOAD_0); - putU1(GETFIELD); - putU2(refInfo(FIELD, "java/lang/reflect/Proxy", "h", - "Ljava/lang/reflect/InvocationHandler;")); - putU1(ALOAD_0); - putU1(GETSTATIC); - putU2(refInfo(FIELD, TypeSignature.getEncodingOfClass(qualName, false), - "m", "[Ljava/lang/reflect/Method;")); - putConst(i); - putU1(AALOAD); - if (paramtypes.length > 0) - { - putConst(paramtypes.length); - putU1(ANEWARRAY); - putU2(classInfo("java/lang/Object")); - param_count = 1; - for (int j = 0; j < paramtypes.length; j++, param_count++) - { - putU1(DUP); - putConst(j); - if (paramtypes[j].isPrimitive()) - { - putU1(NEW); - putU2(classInfo(wrapper(paramtypes[j]))); - putU1(DUP); - } - putLoad(param_count, paramtypes[j]); - if (paramtypes[j].isPrimitive()) - { - putU1(INVOKESPECIAL); - putU2(refInfo(METHOD, wrapper(paramtypes[j]), "<init>", - '(' + (TypeSignature - .getEncodingOfClass(paramtypes[j]) - + ")V"))); - if (paramtypes[j] == long.class - || paramtypes[j] == double.class) - param_count++; - } - putU1(AASTORE); - } - } - else - putU1(ACONST_NULL); - putU1(INVOKEINTERFACE); - putU2(refInfo(INTERFACE, "java/lang/reflect/InvocationHandler", - "invoke", INVOKE_SIG)); - putU1(4); // InvocationHandler, this, Method, Object[] - putU1(0); - if (ret_type == void.class) - putU1(RETURN); - else if (ret_type.isPrimitive()) - { - putU1(CHECKCAST); - putU2(classInfo(wrapper(ret_type))); - putU1(INVOKEVIRTUAL); - putU2(refInfo(METHOD, wrapper(ret_type), - ret_type.getName() + "Value", - "()" + TypeSignature.getEncodingOfClass(ret_type))); - if (ret_type == long.class) - putU1(LRETURN); - else if (ret_type == float.class) - putU1(FRETURN); - else if (ret_type == double.class) - putU1(DRETURN); - else - putU1(IRETURN); - } - else - { - putU1(CHECKCAST); - putU2(classInfo(ret_type)); - putU1(ARETURN); - } - if (! throws_throwable) - { - putU1(NEW); - putU2(classInfo("java/lang/reflect/UndeclaredThrowableException")); - putU1(DUP_X1); - putU1(SWAP); - putU1(INVOKESPECIAL); - putU2(refInfo(METHOD, - "java/lang/reflect/UndeclaredThrowableException", - "<init>", "(Ljava/lang/Throwable;)V")); - putU1(ATHROW); - } - - // handler.Code.exception_table_length - putU2(exception_count); - // handler.Code.exception_table[] - if (! throws_throwable) - { - // handler.Code.exception_table.start_pc - putU2(0); - // handler.Code.exception_table.end_pc - putU2(end_pc); - // handler.Code.exception_table.handler_pc - putU2(handler_pc); - // handler.Code.exception_table.catch_type - putU2(classInfo("java/lang/Error")); - // handler.Code.exception_table.start_pc - putU2(0); - // handler.Code.exception_table.end_pc - putU2(end_pc); - // handler.Code.exception_table.handler_pc - putU2(handler_pc); - // handler.Code.exception_table.catch_type - putU2(classInfo("java/lang/RuntimeException")); - for (int j = 0; j < e.length; j++) - { - // handler.Code.exception_table.start_pc - putU2(0); - // handler.Code.exception_table.end_pc - putU2(end_pc); - // handler.Code.exception_table.handler_pc - putU2(handler_pc); - // handler.Code.exception_table.catch_type - putU2(classInfo(e[j])); - } - // handler.Code.exception_table.start_pc - putU2(0); - // handler.Code.exception_table.end_pc - putU2(end_pc); - // handler.Code.exception_table.handler_pc - - // -8 for undeclared handler, which falls thru to normal one - putU2(handler_pc - 8); - // handler.Code.exception_table.catch_type - putU2(0); - } - // handler.Code.attributes_count - putU2(0); - // handler.Code.attributes[] - - if (e.length > 0) - { - // handler.Exceptions.attribute_name_index - putU2(utf8Info("Exceptions")); - // handler.Exceptions.attribute_length - putU4(2 * e.length + 2); - // handler.Exceptions.number_of_exceptions - putU2(e.length); - // handler.Exceptions.exception_index_table[] - for (int j = 0; j < e.length; j++) - putU2(classInfo(e[j])); - } - } - - /** - * Creates the Class object that corresponds to the bytecode buffers - * built when this object was constructed. - * - * @param loader the class loader to define the proxy class in; null - * implies the bootstrap class loader - * @return the proxy class Class object - */ - Class generate(ClassLoader loader) - { - byte[] bytecode = new byte[pool.length() + stream.length()]; - // More efficient to bypass calling charAt() repetitively. - char[] c = pool.toString().toCharArray(); - int i = c.length; - while (--i >= 0) - bytecode[i] = (byte) c[i]; - c = stream.toString().toCharArray(); - i = c.length; - int j = bytecode.length; - while (i > 0) - bytecode[--j] = (byte) c[--i]; - - // Patch the constant pool size, which we left at 0 earlier. - int count = poolEntries.size() + 1; - bytecode[8] = (byte) (count >> 8); - bytecode[9] = (byte) count; - - try - { - Class vmClassLoader = Class.forName("java.lang.VMClassLoader"); - Class[] types = {ClassLoader.class, String.class, - byte[].class, int.class, int.class, - ProtectionDomain.class }; - Method m = vmClassLoader.getDeclaredMethod("defineClass", types); - // We can bypass the security check of setAccessible(true), since - // we're in the same package. - m.flag = true; - - Object[] args = {loader, qualName, bytecode, Integer.valueOf(0), - Integer.valueOf(bytecode.length), - Object.class.getProtectionDomain() }; - Class clazz = (Class) m.invoke(null, args); - - // Finally, initialize the m field of the proxy class, before - // returning it. - Field f = clazz.getDeclaredField("m"); - f.flag = true; - // we can share the array, because it is not publicized - f.set(null, methods); - - return clazz; - } - catch (Exception e) - { - // assert false; - throw (Error) new InternalError("Unexpected: " + e).initCause(e); - } - } - - /** - * Put a single byte on the stream. - * - * @param i the information to add (only lowest 8 bits are used) - */ - private void putU1(int i) - { - stream.append((char) i); - } - - /** - * Put two bytes on the stream. - * - * @param i the information to add (only lowest 16 bits are used) - */ - private void putU2(int i) - { - stream.append((char) (i >> 8)).append((char) i); - } - - /** - * Put four bytes on the stream. - * - * @param i the information to add (treated as unsigned) - */ - private void putU4(int i) - { - stream.append((char) (i >> 24)).append((char) (i >> 16)); - stream.append((char) (i >> 8)).append((char) i); - } - - /** - * Put bytecode to load a constant integer on the stream. This only - * needs to work for values less than Short.MAX_VALUE. - * - * @param i the int to add - */ - private void putConst(int i) - { - if (i >= -1 && i <= 5) - putU1(ICONST_0 + i); - else if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) - { - putU1(BIPUSH); - putU1(i); - } - else - { - putU1(SIPUSH); - putU2(i); - } - } - - /** - * Put bytecode to load a given local variable on the stream. - * - * @param i the slot to load - * @param type the base type of the load - */ - private void putLoad(int i, Class type) - { - int offset = 0; - if (type == long.class) - offset = 1; - else if (type == float.class) - offset = 2; - else if (type == double.class) - offset = 3; - else if (! type.isPrimitive()) - offset = 4; - if (i < 4) - putU1(ILOAD_0 + 4 * offset + i); - else - { - putU1(ILOAD + offset); - putU1(i); - } - } - - /** - * Given a primitive type, return its wrapper class name. - * - * @param clazz the primitive type (but not void.class) - * @return the internal form of the wrapper class name - */ - private String wrapper(Class clazz) - { - if (clazz == boolean.class) - return "java/lang/Boolean"; - if (clazz == byte.class) - return "java/lang/Byte"; - if (clazz == short.class) - return "java/lang/Short"; - if (clazz == char.class) - return "java/lang/Character"; - if (clazz == int.class) - return "java/lang/Integer"; - if (clazz == long.class) - return "java/lang/Long"; - if (clazz == float.class) - return "java/lang/Float"; - if (clazz == double.class) - return "java/lang/Double"; - // assert false; - return null; - } - - /** - * Returns the entry of this String in the Constant pool, adding it - * if necessary. - * - * @param str the String to resolve - * @return the index of the String in the constant pool - */ - private char utf8Info(String str) - { - String utf8 = toUtf8(str); - int len = utf8.length(); - return poolIndex("\1" + (char) (len >> 8) + (char) (len & 0xff) + utf8); - } - - /** - * Returns the entry of the appropriate class info structure in the - * Constant pool, adding it if necessary. - * - * @param name the class name, in internal form - * @return the index of the ClassInfo in the constant pool - */ - private char classInfo(String name) - { - char index = utf8Info(name); - char[] c = {7, (char) (index >> 8), (char) (index & 0xff)}; - return poolIndex(new String(c)); - } - - /** - * Returns the entry of the appropriate class info structure in the - * Constant pool, adding it if necessary. - * - * @param clazz the class type - * @return the index of the ClassInfo in the constant pool - */ - private char classInfo(Class clazz) - { - return classInfo(TypeSignature.getEncodingOfClass(clazz.getName(), - false)); - } - - /** - * Returns the entry of the appropriate fieldref, methodref, or - * interfacemethodref info structure in the Constant pool, adding it - * if necessary. - * - * @param structure FIELD, METHOD, or INTERFACE - * @param clazz the class name, in internal form - * @param name the simple reference name - * @param type the type of the reference - * @return the index of the appropriate Info structure in the constant pool - */ - private char refInfo(byte structure, String clazz, String name, - String type) - { - char cindex = classInfo(clazz); - char ntindex = nameAndTypeInfo(name, type); - // relies on FIELD == 1, METHOD == 2, INTERFACE == 3 - char[] c = {(char) (structure + 8), - (char) (cindex >> 8), (char) (cindex & 0xff), - (char) (ntindex >> 8), (char) (ntindex & 0xff)}; - return poolIndex(new String(c)); - } - - /** - * Returns the entry of the appropriate nameAndTyperef info structure - * in the Constant pool, adding it if necessary. - * - * @param name the simple name - * @param type the reference type - * @return the index of the NameAndTypeInfo structure in the constant pool - */ - private char nameAndTypeInfo(String name, String type) - { - char nindex = utf8Info(name); - char tindex = utf8Info(type); - char[] c = {12, (char) (nindex >> 8), (char) (nindex & 0xff), - (char) (tindex >> 8), (char) (tindex & 0xff)}; - return poolIndex(new String(c)); - } - - /** - * Converts a regular string to a UTF8 string, where the upper byte - * of every char is 0, and '\\u0000' is not in the string. This is - * basically to use a String as a fancy byte[], and while it is less - * efficient in memory use, it is easier for hashing. - * - * @param str the original, in straight unicode - * @return a modified string, in UTF8 format in the low bytes - */ - private String toUtf8(String str) - { - final char[] ca = str.toCharArray(); - final int len = ca.length; - - // Avoid object creation, if str is already fits UTF8. - int i; - for (i = 0; i < len; i++) - if (ca[i] == 0 || ca[i] > '\u007f') - break; - if (i == len) - return str; - - final CPStringBuilder sb = new CPStringBuilder(str); - sb.setLength(i); - for ( ; i < len; i++) - { - final char c = ca[i]; - if (c > 0 && c <= '\u007f') - sb.append(c); - else if (c <= '\u07ff') // includes '\0' - { - sb.append((char) (0xc0 | (c >> 6))); - sb.append((char) (0x80 | (c & 0x6f))); - } - else - { - sb.append((char) (0xe0 | (c >> 12))); - sb.append((char) (0x80 | ((c >> 6) & 0x6f))); - sb.append((char) (0x80 | (c & 0x6f))); - } - } - return sb.toString(); - } - - /** - * Returns the location of a byte sequence (conveniently wrapped in - * a String with all characters between \u0001 and \u00ff inclusive) - * in the constant pool, adding it if necessary. - * - * @param sequence the byte sequence to look for - * @return the index of the sequence - * @throws IllegalArgumentException if this would make the constant - * pool overflow - */ - private char poolIndex(String sequence) - { - Integer i = (Integer) poolEntries.get(sequence); - if (i == null) - { - // pool starts at index 1 - int size = poolEntries.size() + 1; - if (size >= 65535) - throw new IllegalArgumentException("exceeds VM limitations"); - i = Integer.valueOf(size); - poolEntries.put(sequence, i); - pool.append(sequence); - } - return (char) i.intValue(); - } - } // class ClassFactory -} diff --git a/libjava/classpath/java/lang/reflect/README b/libjava/classpath/java/lang/reflect/README deleted file mode 100644 index 99ea224..0000000 --- a/libjava/classpath/java/lang/reflect/README +++ /dev/null @@ -1,4 +0,0 @@ -README for java.lang.reflect: - -java.lang.reflect is now mostly empty. We've carved out the classes that have -to do with the VM and put them into the VM interface. diff --git a/libjava/classpath/java/lang/reflect/ReflectPermission.java b/libjava/classpath/java/lang/reflect/ReflectPermission.java deleted file mode 100644 index 56eccf8..0000000 --- a/libjava/classpath/java/lang/reflect/ReflectPermission.java +++ /dev/null @@ -1,102 +0,0 @@ -/* ReflectPermission.java - named permission for reflaction - Copyright (C) 2000, 2001, 2005 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; - -import java.security.BasicPermission; - -/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - */ - -/** - * This class implements permissions for reflection. This is a named - * permission, and the only defined name is suppressAccessChecks, which - * allows suppression of normal Java objects when using reflection. - * - * <table> - * <tr> - * <th>Permission Target Name</th> - * <th>What Permission Allows</th> - * <th>Risk of Allowing Permission</th> - * </tr> - * <tr> - * <td><code>suppressAccessChecks</code></td> - * <td>Ability to access fields, invoke methods, and construct objects - * via reflection, including non-public members in contexts where - * such access is not legal at compile-time.</td> - * <td>This is dangerous. It exposes possibly confidential information, - * and malicious code could interfere with the internals of the Virtual - * Machine by corrupting private data.</td> - * </tr> - * </table> - * - * @author Tom Tromey (tromey@redhat.com) - * @author Eric Blake (ebb9@email.byu.edu) - * @since 1.2 - * @status updated to 1.4 - */ -public final class ReflectPermission - extends BasicPermission -{ - /** - * Compatible with JDK 1.2. - */ - private static final long serialVersionUID = 7412737110241507485L; - - /** - * Construct a ReflectPermission with the given name. - * - * @param name The permission name - */ - public ReflectPermission(String name) - { - super(name); - } - - /** - * Construct a ReflectPermission with the given name. - * - * @param name The permission name - * @param actions The actions; this is ignored and should be null - */ - public ReflectPermission(String name, String actions) - { - super(name, actions); - } -} diff --git a/libjava/classpath/java/lang/reflect/TODO b/libjava/classpath/java/lang/reflect/TODO deleted file mode 100755 index 6514c76..0000000 --- a/libjava/classpath/java/lang/reflect/TODO +++ /dev/null @@ -1,4 +0,0 @@ -TODO for java.lang.reflect Java side - -- more tests! -- Java 2 support (waiting on java.lang Java 2 support) diff --git a/libjava/classpath/java/lang/reflect/Type.java b/libjava/classpath/java/lang/reflect/Type.java deleted file mode 100644 index 41b0a9c..0000000 --- a/libjava/classpath/java/lang/reflect/Type.java +++ /dev/null @@ -1,55 +0,0 @@ -/* Type.java - Superinterface for all types. - Copyright (C) 2004, 2005 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; - -/** - * Represents any <code>Type</code> within the Java programming - * language. This may be a primitive type (e.g. <code>int</code>, - * an array type (e.g. <code>double[]>/code>), a raw type - * (e.g. <code>Calendar</code>), a parameterized type - * (e.g. <code>List<Boolean></code>, or a type - * variable (e.g. <code>T extends String</code>). - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public interface Type -{ -} diff --git a/libjava/classpath/java/lang/reflect/TypeVariable.java b/libjava/classpath/java/lang/reflect/TypeVariable.java deleted file mode 100644 index 671c290..0000000 --- a/libjava/classpath/java/lang/reflect/TypeVariable.java +++ /dev/null @@ -1,96 +0,0 @@ -/* TypeVariable.java - Copyright (C) 2004 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; - -/** - * <p> - * This is a common interface for all type variables provided by - * the Java language. Instances are created the first time a type - * variable is needed by one of the reflective methods declared in - * this package. - * </p> - * <p> - * Creating a type variable requires resolving the appropriate type. - * This may involve resolving other classes as a side effect (e.g. - * if the type is nested inside other classes). Creation should not - * involve resolving the bounds. Repeated creation has no effect; an - * equivalent instance is returned. Caching is not required, but all - * instances must be <code>equal()</code> to each other. - * </p> - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public interface TypeVariable<T extends GenericDeclaration> extends Type -{ - - /** - * Returns an array of <code>Type</code> objects which represent the upper - * bounds of this type variable. There is always a default bound of - * <code>Object</code>. Any <code>ParameterizedType</code>s will be - * created as necessary, and other types resolved. - * - * @return an array of <code>Type</code> objects representing the upper - * bounds. - * @throws TypeNotPresentException if any of the bounds refer to a - * non-existant type. - * @throws MalformedParameterizedTypeException if the creation of a - * <code>ParameterizedType</code> fails. - */ - Type[] getBounds(); - - - /** - * Returns a representation of the declaration used to declare this - * type variable. - * - * @return the <code>GenericDeclaration</code> object for this type - * variable. - */ - T getGenericDeclaration(); - - /** - * Returns the name of the type variable, as written in the source - * code. - * - * @return the name of the type variable. - */ - String getName(); -} diff --git a/libjava/classpath/java/lang/reflect/UndeclaredThrowableException.java b/libjava/classpath/java/lang/reflect/UndeclaredThrowableException.java deleted file mode 100644 index ea574ad..0000000 --- a/libjava/classpath/java/lang/reflect/UndeclaredThrowableException.java +++ /dev/null @@ -1,128 +0,0 @@ -/* UndeclaredThrowableException.java -- wraps an undeclared checked exception - thrown by a Proxy invocation handler - Copyright (C) 2001, 2002, 2005 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 exception class is thrown by a {@link Proxy} instance if - * the {@link InvocationHandler#invoke(Object, Method, Object[]) invoke} - * method of that instance's InvocationHandler attempts to throw an - * exception that not declared by the throws clauses of all of the - * interface methods that the proxy instance is implementing. - * - * <p>When thrown by Proxy, this class will always wrap a checked - * exception, never {@link Error} or {@link RuntimeException}, - * which are unchecked. - * - * @author Eric Blake (ebb9@email.byu.edu) - * @see Proxy - * @see InvocationHandler - * @since 1.3 - * @status updated to 1.4 - */ -public class UndeclaredThrowableException extends RuntimeException -{ - /** - * Compatible with JDK 1.3+. - */ - private static final long serialVersionUID = 330127114055056639L; - - /** - * The immutable exception that this wraps. This field is redundant - * with {@link Throwable#getCause()}, but is necessary for serial compatibility. - * - * @serial the chained exception - */ - private final Throwable undeclaredThrowable; - - /** - * Wraps the given checked exception into a RuntimeException, with no - * detail message. {@link Throwable#initCause(Throwable)} will fail - * on this instance. - * - * @param cause the undeclared throwable that caused this exception, - * may be null - */ - public UndeclaredThrowableException(Throwable cause) - { - this(cause, null); - } - - /** - * Wraps the given checked exception into a RuntimeException, with the - * specified detail message. {@link Throwable#initCause(Throwable)} will - * fail on this instance. - * - * @param cause the undeclared throwable that caused this exception, - * may be null - * @param message the message, may be null - */ - public UndeclaredThrowableException(Throwable cause, String message) - { - super(message, cause); - undeclaredThrowable = cause; - } - - /** - * Returns the cause of this exception. If this exception was created - * by a {@link Proxy} instance, it will be a non-null checked - * exception. This method pre-dates exception chaining, and is now - * simply a longer way to call <code>getCause()</code>. - * - * @return the cause of this exception, may be null - * @see #getCause() - */ - public Throwable getUndeclaredThrowable() - { - return undeclaredThrowable; - } - - /** - * Returns the cause of this exception. If this exception was created - * by a {@link Proxy} instance, it will be a non-null checked - * exception. - * - * @return the cause of this exception, may be null - * @since 1.4 - */ - public Throwable getCause() - { - return undeclaredThrowable; - } -} diff --git a/libjava/classpath/java/lang/reflect/WildcardType.java b/libjava/classpath/java/lang/reflect/WildcardType.java deleted file mode 100644 index 43b5d0a4..0000000 --- a/libjava/classpath/java/lang/reflect/WildcardType.java +++ /dev/null @@ -1,115 +0,0 @@ -/* WildcardType.java -- A wildcard type expression e.g. ? extends String - Copyright (C) 2004, 2005 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; - -/** - * Represents a wildcard type expression, where the type variable - * is unnamed. The simplest example of this is <code>?</code>, - * which represents any unbounded type. Another example is - * <code>? extends Number</code>, which specifies any type - * which is a subclass of <code>Number</code> (<code>Number</code> - * is the upper bound). - * </p> - * <p> - * <code>? super String</code> gives the type a less common lower bound, - * which means that the type must be either a <code>String</code> or one - * of its superclasses. This can be useful in working with collections. - * You may want a method to add instances of a class to a collection - * with a more generic type (e.g. adding <code>String</code>s to - * a list of <code>Object</code>s), but don't want to allow users - * to pass in a collection with a more specific type. - * </p> - * - * @author Tom Tromey (tromey@redhat.com) - * @author Andrew John Hughes (gnu_andrew@member.fsf.org) - * @since 1.5 - */ -public interface WildcardType extends Type -{ - - /** - * <p> - * Returns an array of <code>Type</code>s, which specify the - * lower bounds of this type. The default lower bound is - * <code>null</code>, which causes this method to return an - * empty array. - * </p> - * <p> - * In generating the array of <code>Type</code>s, each - * <code>ParameterizedType</code> or <code>TypeVariable</code> is - * created, (see the documentation for these classes for details of this - * process), if necessary, while all other types are simply - * resolved. - * </p> - * - * @return an array of <code>Type</code> objects, representing - * the wildcard type's lower bounds. - * @throws TypeNotPresentException if any of the types referred to by - * the lower bounds of this type do not actually exist. - * @throws MalformedParameterizedTypeException if any of the types - * refer to a type which can not be instantiated. - */ - Type[] getLowerBounds(); - - /** - * <p> - * Returns an array of <code>Type</code>s, which specify the - * upper bounds of this type. The default upper bound is - * <code>Object</code>, which causes this method to return an - * array, containing just the <code>Type</code> instance for - * <code>Object</code>. - * </p> - * <p> - * In generating the array of <code>Type</code>s, each - * <code>ParameterizedType</code> or <code>TypeVariable</code> is - * created, (see the documentation for these classes for details of this - * process), if necessary, while all other types are simply - * resolved. - * </p> - * - * @return an array of <code>Type</code> objects, representing - * the wildcard type's upper bounds. - * @throws TypeNotPresentException if any of the types referred to by - * the upper bounds of this type do not actually exist. - * @throws MalformedParameterizedTypeException if any of the types - * refer to a type which can not be instantiated. - */ - Type[] getUpperBounds(); - -} diff --git a/libjava/classpath/java/lang/reflect/package.html b/libjava/classpath/java/lang/reflect/package.html deleted file mode 100644 index 9f7ed63..0000000 --- a/libjava/classpath/java/lang/reflect/package.html +++ /dev/null @@ -1,47 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> -<!-- package.html - describes classes in java.lang.reflect package. - Copyright (C) 2002 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. --> - -<html> -<head><title>GNU Classpath - java.lang.reflect</title></head> - -<body> -<p>Runtime inspection and manipulation of object classes, methods, arguments -and fields.</p> - -</body> -</html> |