diff options
author | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2008-03-03 18:59:08 +0000 |
---|---|---|
committer | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2008-03-03 18:59:08 +0000 |
commit | 2062baf6faf3f19d1c92163d510487c1421c0f80 (patch) | |
tree | e1f58b8f6eb2328c7720b4e185e398739ddddd35 | |
parent | 0e64b167b833cd6de0c8c3f7ef88699a4b080d25 (diff) | |
download | classpath-2062baf6faf3f19d1c92163d510487c1421c0f80.tar.gz |
2008-02-30 Andrew John Hughes <gnu_andrew@member.fsf.org>
* java/lang/reflect/Constructor.java,
* java/lang/reflect/Field.java,
* java/lang/reflect/Method.java:
New classes within GNU Classpath that provide
common reflection functionality.
* vm/reference/java/lang/reflect/Constructor.java,
* vm/reference/java/lang/reflect/Field.java,
* vm/reference/java/lang/reflect/Method.java:
Removed.
* vm/reference/java/lang/reflect/VMConstructor.java,
* vm/reference/java/lang/reflect/VMField.java,
* vm/reference/java/lang/reflect/VMMethod.java:
New VM interface for reflection.
-rw-r--r-- | ChangeLog | 16 | ||||
-rwxr-xr-x[-rw-r--r--] | java/lang/reflect/Constructor.java (renamed from vm/reference/java/lang/reflect/Constructor.java) | 89 | ||||
-rw-r--r-- | java/lang/reflect/Field.java (renamed from vm/reference/java/lang/reflect/Field.java) | 175 | ||||
-rw-r--r-- | java/lang/reflect/Method.java (renamed from vm/reference/java/lang/reflect/Method.java) | 110 | ||||
-rw-r--r-- | vm/reference/java/lang/reflect/VMConstructor.java | 107 | ||||
-rw-r--r-- | vm/reference/java/lang/reflect/VMField.java | 495 | ||||
-rw-r--r-- | vm/reference/java/lang/reflect/VMMethod.java | 127 |
7 files changed, 966 insertions, 153 deletions
@@ -1,3 +1,19 @@ +2008-02-30 Andrew John Hughes <gnu_andrew@member.fsf.org> + + * java/lang/reflect/Constructor.java, + * java/lang/reflect/Field.java, + * java/lang/reflect/Method.java: + New classes within GNU Classpath that provide + common reflection functionality. + * vm/reference/java/lang/reflect/Constructor.java, + * vm/reference/java/lang/reflect/Field.java, + * vm/reference/java/lang/reflect/Method.java: + Removed. + * vm/reference/java/lang/reflect/VMConstructor.java, + * vm/reference/java/lang/reflect/VMField.java, + * vm/reference/java/lang/reflect/VMMethod.java: + New VM interface for reflection. + 2008-03-03 Andrew John Hughes <gnu_andrew@member.fsf.org> PR classpath/28664 diff --git a/vm/reference/java/lang/reflect/Constructor.java b/java/lang/reflect/Constructor.java index 282e7680b..81eab4e8b 100644..100755 --- a/vm/reference/java/lang/reflect/Constructor.java +++ b/java/lang/reflect/Constructor.java @@ -83,16 +83,18 @@ public final class Constructor<T> extends AccessibleObject implements GenericDeclaration, Member { - private Class<T> clazz; - private int slot; + Class<T> clazz; + int slot; - private static final int CONSTRUCTOR_MODIFIERS + static final int CONSTRUCTOR_MODIFIERS = Modifier.PRIVATE | Modifier.PROTECTED | Modifier.PUBLIC; + private MethodSignatureParser p; + /** - * This class is uninstantiable except from native code. + * This class is uninstantiable outside this package. */ - private Constructor(Class declaringClass,int slot) + Constructor(Class<T> declaringClass,int slot) { this.clazz = declaringClass; this.slot = slot; @@ -122,13 +124,6 @@ public final class Constructor<T> } /** - * Return the raw modifiers for this constructor. In particular - * this will include the synthetic and varargs bits. - * @return the constructor's modifiers - */ - private native int getModifiersInternal(); - - /** * 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. @@ -138,7 +133,7 @@ public final class Constructor<T> */ public int getModifiers() { - return getModifiersInternal() & CONSTRUCTOR_MODIFIERS; + return VMConstructor.getModifiersInternal(this) & CONSTRUCTOR_MODIFIERS; } /** @@ -149,7 +144,7 @@ public final class Constructor<T> */ public boolean isSynthetic() { - return (getModifiersInternal() & Modifier.SYNTHETIC) != 0; + return (VMConstructor.getModifiersInternal(this) & Modifier.SYNTHETIC) != 0; } /** @@ -159,7 +154,7 @@ public final class Constructor<T> */ public boolean isVarArgs() { - return (getModifiersInternal() & Modifier.VARARGS) != 0; + return (VMConstructor.getModifiersInternal(this) & Modifier.VARARGS) != 0; } /** @@ -168,7 +163,11 @@ public final class Constructor<T> * * @return a list of the types of the constructor's parameters */ - public native Class<?>[] getParameterTypes(); + @SuppressWarnings("unchecked") + public Class<?>[] getParameterTypes() + { + return (Class<?>[]) VMConstructor.getParameterTypes(this); + } /** * Get the exception types this constructor says it throws, in no particular @@ -177,7 +176,11 @@ public final class Constructor<T> * * @return a list of the types in the constructor's throws clause */ - public native Class<?>[] getExceptionTypes(); + @SuppressWarnings("unchecked") + public Class<?>[] getExceptionTypes() + { + return (Class<?>[]) VMConstructor.getExceptionTypes(this); + } /** * Compare two objects to see if they are semantically equivalent. @@ -315,18 +318,14 @@ public final class Constructor<T> * @throws ExceptionInInitializerError if construction triggered class * initialization, which then failed */ + @SuppressWarnings("unchecked") public T newInstance(Object... args) throws InstantiationException, IllegalAccessException, InvocationTargetException { - return constructNative(args, clazz, slot); + return (T) VMConstructor.constructNative(args, clazz, slot); } - private native T constructNative(Object[] args, Class declaringClass, - int slot) - throws InstantiationException, IllegalAccessException, - InvocationTargetException; - /** * Returns an array of <code>TypeVariable</code> objects that represents * the type variables declared by this constructor, in declaration order. @@ -341,20 +340,17 @@ public final class Constructor<T> */ public TypeVariable<Constructor<T>>[] getTypeParameters() { - String sig = getSignature(); - if (sig == null) - return new TypeVariable[0]; - MethodSignatureParser p = new MethodSignatureParser(this, sig); + if (p == null) + { + String sig = VMConstructor.getSignature(this); + if (sig == null) + return new TypeVariable[0]; + p = new MethodSignatureParser(this, sig); + } return p.getTypeParameters(); } /** - * Return the String in the Signature attribute for this constructor. If there - * is no Signature attribute, return null. - */ - private native String getSignature(); - - /** * 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 @@ -368,10 +364,13 @@ public final class Constructor<T> */ public Type[] getGenericExceptionTypes() { - String sig = getSignature(); - if (sig == null) - return getExceptionTypes(); - MethodSignatureParser p = new MethodSignatureParser(this, sig); + if (p == null) + { + String sig = VMConstructor.getSignature(this); + if (sig == null) + return getExceptionTypes(); + p = new MethodSignatureParser(this, sig); + } return p.getGenericExceptionTypes(); } @@ -389,10 +388,13 @@ public final class Constructor<T> */ public Type[] getGenericParameterTypes() { - String sig = getSignature(); - if (sig == null) - return getParameterTypes(); - MethodSignatureParser p = new MethodSignatureParser(this, sig); + if (p == null) + { + String sig = VMConstructor.getSignature(this); + if (sig == null) + return getParameterTypes(); + p = new MethodSignatureParser(this, sig); + } return p.getGenericParameterTypes(); } @@ -416,6 +418,9 @@ public final class Constructor<T> * matches the declaration order of the parameters. * @since 1.5 */ - public native Annotation[][] getParameterAnnotations(); + public Annotation[][] getParameterAnnotations() + { + return VMConstructor.getParameterAnnotations(this); + } } diff --git a/vm/reference/java/lang/reflect/Field.java b/java/lang/reflect/Field.java index e0efb6f36..fcf54658e 100644 --- a/vm/reference/java/lang/reflect/Field.java +++ b/java/lang/reflect/Field.java @@ -79,19 +79,21 @@ import gnu.java.lang.reflect.FieldSignatureParser; public final class Field extends AccessibleObject implements Member { - private Class declaringClass; - private String name; - private int slot; + Class declaringClass; + String name; + int slot; - private static final int FIELD_MODIFIERS + static final int FIELD_MODIFIERS = Modifier.FINAL | Modifier.PRIVATE | Modifier.PROTECTED | Modifier.PUBLIC | Modifier.STATIC | Modifier.TRANSIENT | Modifier.VOLATILE; + private FieldSignatureParser p; + /** - * This class is uninstantiable except natively. + * This class is uninstantiable outside the package. */ - private Field(Class declaringClass, String name, int slot) + Field(Class declaringClass, String name, int slot) { this.declaringClass = declaringClass; this.name = name; @@ -118,12 +120,6 @@ extends AccessibleObject implements Member } /** - * Return the raw modifiers for this field. - * @return the field's modifiers - */ - private native int getModifiersInternal(); - - /** * 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, @@ -134,7 +130,7 @@ extends AccessibleObject implements Member */ public int getModifiers() { - return getModifiersInternal() & FIELD_MODIFIERS; + return VMField.getModifiersInternal(this) & FIELD_MODIFIERS; } /** @@ -143,7 +139,7 @@ extends AccessibleObject implements Member */ public boolean isSynthetic() { - return (getModifiersInternal() & Modifier.SYNTHETIC) != 0; + return (VMField.getModifiersInternal(this) & Modifier.SYNTHETIC) != 0; } /** @@ -153,14 +149,17 @@ extends AccessibleObject implements Member */ public boolean isEnumConstant() { - return (getModifiersInternal() & Modifier.ENUM) != 0; + return (VMField.getModifiersInternal(this) & Modifier.ENUM) != 0; } /** * Gets the type of this field. * @return the type of this field */ - public native Class<?> getType(); + public Class<?> getType() + { + return VMField.getType(this); + } /** * Compare two objects to see if they are semantically equivalent. @@ -265,8 +264,11 @@ extends AccessibleObject implements Member * @see #getFloat(Object) * @see #getDouble(Object) */ - public native Object get(Object o) - throws IllegalAccessException; + public Object get(Object o) + throws IllegalAccessException + { + return VMField.get(this, o); + } /** * Get the value of this boolean Field. If the field is static, @@ -285,8 +287,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native boolean getBoolean(Object o) - throws IllegalAccessException; + public boolean getBoolean(Object o) + throws IllegalAccessException + { + return VMField.getBoolean(this, o); + } /** * Get the value of this byte Field. If the field is static, @@ -305,8 +310,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native byte getByte(Object o) - throws IllegalAccessException; + public byte getByte(Object o) + throws IllegalAccessException + { + return VMField.getByte(this, o); + } /** * Get the value of this Field as a char. If the field is static, @@ -323,8 +331,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native char getChar(Object o) - throws IllegalAccessException; + public char getChar(Object o) + throws IllegalAccessException + { + return VMField.getChar(this, o); + } /** * Get the value of this Field as a short. If the field is static, @@ -343,8 +354,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native short getShort(Object o) - throws IllegalAccessException; + public short getShort(Object o) + throws IllegalAccessException + { + return VMField.getShort(this, o); + } /** * Get the value of this Field as an int. If the field is static, @@ -363,8 +377,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native int getInt(Object o) - throws IllegalAccessException; + public int getInt(Object o) + throws IllegalAccessException + { + return VMField.getInt(this, o); + } /** * Get the value of this Field as a long. If the field is static, @@ -383,8 +400,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native long getLong(Object o) - throws IllegalAccessException; + public long getLong(Object o) + throws IllegalAccessException + { + return VMField.getLong(this, o); + } /** * Get the value of this Field as a float. If the field is static, @@ -403,8 +423,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native float getFloat(Object o) - throws IllegalAccessException; + public float getFloat(Object o) + throws IllegalAccessException + { + return VMField.getFloat(this, o); + } /** * Get the value of this Field as a double. If the field is static, @@ -424,8 +447,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #get(Object) */ - public native double getDouble(Object o) - throws IllegalAccessException; + public double getDouble(Object o) + throws IllegalAccessException + { + return VMField.getDouble(this, o); + } /** * Set the value of this Field. If it is a primitive field, the value @@ -472,8 +498,11 @@ extends AccessibleObject implements Member * @see #setFloat(Object, float) * @see #setDouble(Object, double) */ - public native void set(Object o, Object value) - throws IllegalAccessException; + public void set(Object o, Object value) + throws IllegalAccessException + { + VMField.set(this, o, value); + } /** * Set this boolean Field. If the field is static, <code>o</code> will be @@ -492,8 +521,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setBoolean(Object o, boolean value) - throws IllegalAccessException; + public void setBoolean(Object o, boolean value) + throws IllegalAccessException + { + VMField.setBoolean(this, o, value); + } /** * Set this byte Field. If the field is static, <code>o</code> will be @@ -512,8 +544,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setByte(Object o, byte value) - throws IllegalAccessException; + public void setByte(Object o, byte value) + throws IllegalAccessException + { + VMField.setByte(this, o, value); + } /** * Set this char Field. If the field is static, <code>o</code> will be @@ -532,8 +567,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setChar(Object o, char value) - throws IllegalAccessException; + public void setChar(Object o, char value) + throws IllegalAccessException + { + VMField.setChar(this, o, value); + } /** * Set this short Field. If the field is static, <code>o</code> will be @@ -552,8 +590,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setShort(Object o, short value) - throws IllegalAccessException; + public void setShort(Object o, short value) + throws IllegalAccessException + { + VMField.setShort(this, o, value); + } /** * Set this int Field. If the field is static, <code>o</code> will be @@ -572,8 +613,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setInt(Object o, int value) - throws IllegalAccessException; + public void setInt(Object o, int value) + throws IllegalAccessException + { + VMField.setInt(this, o, value); + } /** * Set this long Field. If the field is static, <code>o</code> will be @@ -592,8 +636,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setLong(Object o, long value) - throws IllegalAccessException; + public void setLong(Object o, long value) + throws IllegalAccessException + { + VMField.setLong(this, o, value); + } /** * Set this float Field. If the field is static, <code>o</code> will be @@ -612,8 +659,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setFloat(Object o, float value) - throws IllegalAccessException; + public void setFloat(Object o, float value) + throws IllegalAccessException + { + VMField.setFloat(this, o, value); + } /** * Set this double Field. If the field is static, <code>o</code> will be @@ -632,8 +682,11 @@ extends AccessibleObject implements Member * class initialization, which then failed * @see #set(Object, Object) */ - public native void setDouble(Object o, double value) - throws IllegalAccessException; + public void setDouble(Object o, double value) + throws IllegalAccessException + { + VMField.setDouble(this, o, value); + } /** * Return the generic type of the field. If the field type is not a generic @@ -646,17 +699,15 @@ extends AccessibleObject implements Member */ public Type getGenericType() { - String signature = getSignature(); - if (signature == null) - return getType(); - FieldSignatureParser p = new FieldSignatureParser(getDeclaringClass(), - signature); + if (p == null) + { + String signature = VMField.getSignature(this); + if (signature == null) + return getType(); + p = new FieldSignatureParser(getDeclaringClass(), + signature); + } return p.getFieldType(); } - /** - * Return the String in the Signature attribute for this field. If there - * is no Signature attribute, return null. - */ - private native String getSignature(); } diff --git a/vm/reference/java/lang/reflect/Method.java b/java/lang/reflect/Method.java index e95c54a8c..08962b35a 100644 --- a/vm/reference/java/lang/reflect/Method.java +++ b/java/lang/reflect/Method.java @@ -86,15 +86,17 @@ extends AccessibleObject implements Member, GenericDeclaration String name; int slot; - private static final int METHOD_MODIFIERS + 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; + /** - * This class is uninstantiable. + * This class is uninstantiable outside this package. */ - private Method(Class declaringClass, String name, int slot) + Method(Class declaringClass, String name, int slot) { this.declaringClass = declaringClass; this.name = name; @@ -121,12 +123,6 @@ extends AccessibleObject implements Member, GenericDeclaration } /** - * Return the raw modifiers for this method. - * @return the method's modifiers - */ - private native int getModifiersInternal(); - - /** * 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, @@ -137,7 +133,7 @@ extends AccessibleObject implements Member, GenericDeclaration */ public int getModifiers() { - return getModifiersInternal() & METHOD_MODIFIERS; + return VMMethod.getModifiersInternal(this) & METHOD_MODIFIERS; } /** @@ -148,7 +144,7 @@ extends AccessibleObject implements Member, GenericDeclaration */ public boolean isBridge() { - return (getModifiersInternal() & Modifier.BRIDGE) != 0; + return (VMMethod.getModifiersInternal(this) & Modifier.BRIDGE) != 0; } /** @@ -157,7 +153,7 @@ extends AccessibleObject implements Member, GenericDeclaration */ public boolean isSynthetic() { - return (getModifiersInternal() & Modifier.SYNTHETIC) != 0; + return (VMMethod.getModifiersInternal(this) & Modifier.SYNTHETIC) != 0; } /** @@ -167,14 +163,18 @@ extends AccessibleObject implements Member, GenericDeclaration */ public boolean isVarArgs() { - return (getModifiersInternal() & Modifier.VARARGS) != 0; + return (VMMethod.getModifiersInternal(this) & Modifier.VARARGS) != 0; } /** * Gets the return type of this method. * @return the type of this method */ - public native Class<?> getReturnType(); + @SuppressWarnings("unchecked") + public Class<?> getReturnType() + { + return (Class<?>) VMMethod.getReturnType(this); + } /** * Get the parameter list for this method, in declaration order. If the @@ -182,7 +182,11 @@ extends AccessibleObject implements Member, GenericDeclaration * * @return a list of the types of the method's parameters */ - public native Class<?>[] getParameterTypes(); + @SuppressWarnings("unchecked") + public Class<?>[] getParameterTypes() + { + return (Class<?>[]) VMMethod.getParameterTypes(this); + } /** * Get the exception types this method says it throws, in no particular @@ -191,7 +195,11 @@ extends AccessibleObject implements Member, GenericDeclaration * * @return a list of the types in the method's throws clause */ - public native Class<?>[] getExceptionTypes(); + @SuppressWarnings("unchecked") + public Class<?>[] getExceptionTypes() + { + return (Class<?>[]) VMMethod.getExceptionTypes(this); + } /** * Compare two objects to see if they are semantically equivalent. @@ -354,17 +362,9 @@ extends AccessibleObject implements Member, GenericDeclaration public Object invoke(Object o, Object... args) throws IllegalAccessException, InvocationTargetException { - return invokeNative(o, args, declaringClass, slot); + return VMMethod.invokeNative(o, args, declaringClass, slot); } - /* - * NATIVE HELPERS - */ - - private native Object invokeNative(Object o, Object[] args, - Class declaringClass, int slot) - throws IllegalAccessException, InvocationTargetException; - /** * Returns an array of <code>TypeVariable</code> objects that represents * the type variables declared by this constructor, in declaration order. @@ -379,20 +379,17 @@ extends AccessibleObject implements Member, GenericDeclaration */ public TypeVariable<Method>[] getTypeParameters() { - String sig = getSignature(); - if (sig == null) - return new TypeVariable[0]; - MethodSignatureParser p = new MethodSignatureParser(this, sig); + if (p == null) + { + String sig = VMMethod.getSignature(this); + if (sig == null) + return (TypeVariable<Method>[]) new TypeVariable[0]; + p = new MethodSignatureParser(this, sig); + } return p.getTypeParameters(); } /** - * Return the String in the Signature attribute for this method. If there - * is no Signature attribute, return null. - */ - private native String getSignature(); - - /** * 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 @@ -406,10 +403,13 @@ extends AccessibleObject implements Member, GenericDeclaration */ public Type[] getGenericExceptionTypes() { - String sig = getSignature(); - if (sig == null) - return getExceptionTypes(); - MethodSignatureParser p = new MethodSignatureParser(this, sig); + if (p == null) + { + String sig = VMMethod.getSignature(this); + if (sig == null) + return getExceptionTypes(); + p = new MethodSignatureParser(this, sig); + } return p.getGenericExceptionTypes(); } @@ -427,10 +427,13 @@ extends AccessibleObject implements Member, GenericDeclaration */ public Type[] getGenericParameterTypes() { - String sig = getSignature(); - if (sig == null) - return getParameterTypes(); - MethodSignatureParser p = new MethodSignatureParser(this, sig); + if (p == null) + { + String sig = VMMethod.getSignature(this); + if (sig == null) + return getParameterTypes(); + p = new MethodSignatureParser(this, sig); + } return p.getGenericParameterTypes(); } @@ -445,10 +448,13 @@ extends AccessibleObject implements Member, GenericDeclaration */ public Type getGenericReturnType() { - String sig = getSignature(); - if (sig == null) - return getReturnType(); - MethodSignatureParser p = new MethodSignatureParser(this, sig); + if (p == null) + { + String sig = VMMethod.getSignature(this); + if (sig == null) + return getReturnType(); + p = new MethodSignatureParser(this, sig); + } return p.getGenericReturnType(); } @@ -463,7 +469,10 @@ extends AccessibleObject implements Member, GenericDeclaration * * @since 1.5 */ - public native Object getDefaultValue(); + public Object getDefaultValue() + { + return VMMethod.getDefaultValue(this); + } /** * <p> @@ -485,6 +494,9 @@ extends AccessibleObject implements Member, GenericDeclaration * matches the declaration order of the parameters. * @since 1.5 */ - public native Annotation[][] getParameterAnnotations(); + public Annotation[][] getParameterAnnotations() + { + return VMMethod.getParameterAnnotations(this); + } } diff --git a/vm/reference/java/lang/reflect/VMConstructor.java b/vm/reference/java/lang/reflect/VMConstructor.java new file mode 100644 index 000000000..b2eb3ff85 --- /dev/null +++ b/vm/reference/java/lang/reflect/VMConstructor.java @@ -0,0 +1,107 @@ +/* java.lang.reflect.VMConstructor - VM interface for 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 java.lang.annotation.Annotation; + +final class VMConstructor +{ + /** + * Return the raw modifiers for this constructor. In particular + * this will include the synthetic and varargs bits. + * @param c the constructor concerned. + * @return the constructor's modifiers + */ + static native int getModifiersInternal(Constructor c); + + /** + * Get the parameter list for this constructor, in declaration order. If the + * constructor takes no parameters, returns a 0-length array (not null). + * + * @param c the constructor concerned. + * @return a list of the types of the constructor's parameters + */ + static native Class[] getParameterTypes(Constructor c); + + /** + * 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). + * + * @param c the constructor concerned. + * @return a list of the types in the constructor's throws clause + */ + static native Class[] getExceptionTypes(Constructor c); + + static native Object constructNative(Object[] args, Class declaringClass, + int slot) + throws InstantiationException, IllegalAccessException, + InvocationTargetException; + + /** + * Return the String in the Signature attribute for this constructor. If there + * is no Signature attribute, return null. + * @param c the constructor concerned. + */ + static native String getSignature(Constructor c); + + /** + * <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> + * + * @param c the constructor concerned. + * @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 + */ + static native Annotation[][] getParameterAnnotations(Constructor c); + +} diff --git a/vm/reference/java/lang/reflect/VMField.java b/vm/reference/java/lang/reflect/VMField.java new file mode 100644 index 000000000..3b294a368 --- /dev/null +++ b/vm/reference/java/lang/reflect/VMField.java @@ -0,0 +1,495 @@ +/* java.lang.reflect.Field - VM interface for 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; + +final class VMField +{ + + /** + * Return the raw modifiers for this field. + * @param f the field concerned. + * @return the field's modifiers + */ + static native int getModifiersInternal(Field f); + + /** + * Gets the type of this field. + * @param f the field concerned. + * @return the type of this field + */ + static native Class getType(Field f); + + /** + * 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 f the field concerned. + * @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) + */ + static native Object get(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this boolean Field. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @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) + */ + static native boolean getBoolean(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this byte Field. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @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) + */ + static native byte getByte(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this Field as a char. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @param o the object to get the value of this Field from + * @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) + */ + static native char getChar(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this Field as a short. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @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) + */ + static native short getShort(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this Field as an int. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @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) + */ + static native int getInt(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this Field as a long. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @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) + */ + static native long getLong(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this Field as a float. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @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) + */ + static native float getFloat(Field f, Object o) + throws IllegalAccessException; + + /** + * Get the value of this Field as a double. If the field is static, + * <code>o</code> will be ignored. + * + * @param f the field concerned. + * @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) + */ + static native double getDouble(Field f, Object o) + throws IllegalAccessException; + + /** + * 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 f the field concerned. + * @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) + */ + static native void set(Field f, Object o, Object value) + throws IllegalAccessException; + + /** + * Set this boolean Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setBoolean(Field f, Object o, boolean value) + throws IllegalAccessException; + + /** + * Set this byte Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setByte(Field f, Object o, byte value) + throws IllegalAccessException; + + /** + * Set this char Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setChar(Field f, Object o, char value) + throws IllegalAccessException; + + /** + * Set this short Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setShort(Field f, Object o, short value) + throws IllegalAccessException; + + /** + * Set this int Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setInt(Field f, Object o, int value) + throws IllegalAccessException; + + /** + * Set this long Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setLong(Field f, Object o, long value) + throws IllegalAccessException; + + /** + * Set this float Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setFloat(Field f, Object o, float value) + throws IllegalAccessException; + + /** + * Set this double Field. If the field is static, <code>o</code> will be + * ignored. + * + * @param f the field concerned. + * @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) + */ + static native void setDouble(Field f, Object o, double value) + throws IllegalAccessException; + + /** + * Return the String in the Signature attribute for this field. If there + * is no Signature attribute, return null. + * + * @param f the field concerned. + */ + static native String getSignature(Field f); + +} diff --git a/vm/reference/java/lang/reflect/VMMethod.java b/vm/reference/java/lang/reflect/VMMethod.java new file mode 100644 index 000000000..e393780e4 --- /dev/null +++ b/vm/reference/java/lang/reflect/VMMethod.java @@ -0,0 +1,127 @@ +/* java.lang.reflect.VMMethod - VM interface for 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 java.lang.annotation.Annotation; + +final class VMMethod +{ + /** + * Return the raw modifiers for this method. + * @param m the method concerned. + * @return the method's modifiers + */ + static native int getModifiersInternal(Method m); + + /** + * Gets the return type of this method. + * @param m the method concerned. + * @return the type of this method + */ + static native Class getReturnType(Method m); + + /** + * Get the parameter list for this method, in declaration order. If the + * method takes no parameters, returns a 0-length array (not null). + * + * @param m the method concerned. + * @return a list of the types of the method's parameters + */ + static native Class[] getParameterTypes(Method m); + + /** + * 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). + * + * @param m the method concerned. + * @return a list of the types in the method's throws clause + */ + static native Class[] getExceptionTypes(Method m); + + static native Object invokeNative(Object o, Object[] args, + Class declaringClass, int slot) + throws IllegalAccessException, InvocationTargetException; + + /** + * Return the String in the Signature attribute for this method. If there + * is no Signature attribute, return null. + * @param m the method concerned. + */ + static native String getSignature(Method m); + + /** + * 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. + * + * @param m the method concerned. + * @throws TypeNotPresentException if the method returns a Class, + * and the class cannot be found + * + * @since 1.5 + */ + static native Object getDefaultValue(Method m); + + /** + * <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> + * + * @param m the method concerned. + * @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 + */ + static native Annotation[][] getParameterAnnotations(Method m); + +} + |