|
From: <ls...@us...> - 2007-01-27 07:54:11
|
Revision: 3087
http://jnode.svn.sourceforge.net/jnode/?rev=3087&view=rev
Author: lsantha
Date: 2007-01-26 23:54:10 -0800 (Fri, 26 Jan 2007)
Log Message:
-----------
Classpath patches.
Modified Paths:
--------------
trunk/core/src/classpath/java/java/lang/reflect/AccessibleObject.java
trunk/core/src/classpath/java/java/lang/reflect/Proxy.java
trunk/core/src/classpath/vm/java/lang/reflect/Constructor.java
trunk/core/src/classpath/vm/java/lang/reflect/Field.java
trunk/core/src/classpath/vm/java/lang/reflect/Method.java
Modified: trunk/core/src/classpath/java/java/lang/reflect/AccessibleObject.java
===================================================================
--- trunk/core/src/classpath/java/java/lang/reflect/AccessibleObject.java 2007-01-20 08:55:33 UTC (rev 3086)
+++ trunk/core/src/classpath/java/java/lang/reflect/AccessibleObject.java 2007-01-27 07:54:10 UTC (rev 3087)
@@ -1,5 +1,5 @@
/* java.lang.reflect.AccessibleObject
- Copyright (C) 2001, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@
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
@@ -53,9 +55,10 @@
* @see Method
* @see ReflectPermission
* @since 1.2
- * @status updated to 1.4
+ * @status updated to 1.5
*/
public class AccessibleObject
+ implements AnnotatedElement
{
/**
* True if this object is marked accessible, which means the reflected
@@ -156,4 +159,24 @@
throw new SecurityException("Cannot make object accessible: " + this);
this.flag = flag;
}
+
+ public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
+ {
+ throw new AssertionError("Subclass must override this method");
+ }
+
+ public Annotation[] getAnnotations()
+ {
+ return getDeclaredAnnotations();
+ }
+
+ public Annotation[] getDeclaredAnnotations()
+ {
+ throw new AssertionError("Subclass must override this method");
+ }
+
+ public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
+ {
+ return getAnnotation(annotationClass) != null;
+ }
}
Modified: trunk/core/src/classpath/java/java/lang/reflect/Proxy.java
===================================================================
--- trunk/core/src/classpath/java/java/lang/reflect/Proxy.java 2007-01-20 08:55:33 UTC (rev 3086)
+++ trunk/core/src/classpath/java/java/lang/reflect/Proxy.java 2007-01-27 07:54:10 UTC (rev 3087)
@@ -158,7 +158,7 @@
* @see Class
* @author Eric Blake (eb...@em...)
* @since 1.3
- * @status updated to 1.4, except for the use of ProtectionDomain
+ * @status updated to 1.5, except for the use of ProtectionDomain
*/
public class Proxy implements Serializable
{
@@ -257,8 +257,8 @@
*/
// 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)
+ public static synchronized Class<?> getProxyClass(ClassLoader loader,
+ Class<?>... interfaces)
{
interfaces = (Class[]) interfaces.clone();
ProxyType pt = new ProxyType(loader, interfaces);
@@ -312,7 +312,7 @@
* @see Constructor#newInstance(Object[])
*/
public static Object newProxyInstance(ClassLoader loader,
- Class[] interfaces,
+ Class<?>[] interfaces,
InvocationHandler handler)
{
try
@@ -360,7 +360,7 @@
*/
// 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)
+ public static synchronized boolean isProxyClass(Class<?> clazz)
{
if (! Proxy.class.isAssignableFrom(clazz))
return false;
@@ -889,7 +889,7 @@
// constant_pool[], filled in as we go
// access_flags
- putU2(/*Modifier.SUPER |*/ Modifier.FINAL | Modifier.PUBLIC);
+ putU2(Modifier.SUPER | Modifier.FINAL | Modifier.PUBLIC);
// this_class
qualName = (data.pack + "$Proxy" + data.id);
putU2(classInfo(TypeSignature.getEncodingOfClass(qualName, false)));
Modified: trunk/core/src/classpath/vm/java/lang/reflect/Constructor.java
===================================================================
--- trunk/core/src/classpath/vm/java/lang/reflect/Constructor.java 2007-01-20 08:55:33 UTC (rev 3086)
+++ trunk/core/src/classpath/vm/java/lang/reflect/Constructor.java 2007-01-27 07:54:10 UTC (rev 3087)
@@ -38,6 +38,7 @@
package java.lang.reflect;
+import gnu.java.lang.ClassHelper;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
@@ -46,6 +47,8 @@
import org.jnode.vm.classmgr.VmMethod;
import gnu.java.lang.reflect.MethodSignatureParser;
+import java.util.Arrays;
+
/**
* The Constructor class represents a constructor of a class. It also allows
* dynamic creation of an object, via reflection. Invocation on Constructor
@@ -104,7 +107,8 @@
* Gets the class that declared this constructor.
* @return the class that declared this member
*/
- public Class<T> getDeclaringClass() {
+ public Class<T> getDeclaringClass()
+ {
return (Class<T>) vmMethod.getDeclaringClass().asClass();
}
@@ -123,12 +127,11 @@
* this will include the synthetic and varargs bits.
* @return the constructor's modifiers
*/
- private int getModifiersInternal() {
+ private int getModifiersInternal()
+ {
return vmMethod.getModifiers();
}
-
-
/**
* 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
@@ -169,7 +172,8 @@
*
* @return a list of the types of the constructor's parameters
*/
- public Class<?>[] getParameterTypes() {
+ public Class<?>[] getParameterTypes()
+ {
if (parameterTypes == null) {
int cnt = vmMethod.getNoArguments();
ArrayList<Class> list = new ArrayList<Class>(cnt);
@@ -211,8 +215,16 @@
* @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 (this == o);
+ public boolean equals(Object o)
+ {
+ if (!(o instanceof Constructor))
+ return false;
+ Constructor that = (Constructor)o;
+ if (this.getDeclaringClass() != that.getDeclaringClass())
+ return false;
+ if (!Arrays.equals(this.getParameterTypes(), that.getParameterTypes()))
+ return false;
+ return true;
}
/**
@@ -240,23 +252,60 @@
// 128 is a reasonable buffer initial size for constructor
StringBuilder sb = new StringBuilder(128);
Modifier.toString(getModifiers(), sb).append(' ');
- final Class<?> declClass = getDeclaringClass();
- sb.append(declClass.getName()).append('(');
- Class<?>[] c = getParameterTypes();
- if (c.length > 0) {
- sb.append(c[0].getName());
- for (int i = 1; i < c.length; i++) {
- sb.append(',').append(c[i].getName());
+ 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++) {
+ for (int i = 1; i < c.length; i++)
sb.append(',').append(c[i].getName());
}
+ return sb.toString();
}
+
+ static <X extends GenericDeclaration>
+ void addTypeParameters(StringBuilder 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()
+ {
+ StringBuilder sb = new StringBuilder(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();
}
@@ -294,14 +343,6 @@
return (T) VmReflection.newInstance(vmMethod, args);
}
- /**
- * Return the String in the Signature attribute for this constructor. If there
- * is no Signature attribute, return null.
- */
- private String getSignature(){
- //todo implement it
- return null;
- }
/**
* Returns an array of <code>TypeVariable</code> objects that represents
@@ -315,7 +356,7 @@
* specification, version 3.
* @since 1.5
*/
- public TypeVariable[] getTypeParameters()
+ public TypeVariable<Constructor<T>>[] getTypeParameters()
{
String sig = getSignature();
if (sig == null)
@@ -325,6 +366,15 @@
}
/**
+ * Return the String in the Signature attribute for this constructor. If there
+ * is no Signature attribute, return null.
+ */
+ private String getSignature()
+ {
+ return vmMethod.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
Modified: trunk/core/src/classpath/vm/java/lang/reflect/Field.java
===================================================================
--- trunk/core/src/classpath/vm/java/lang/reflect/Field.java 2007-01-20 08:55:33 UTC (rev 3086)
+++ trunk/core/src/classpath/vm/java/lang/reflect/Field.java 2007-01-27 07:54:10 UTC (rev 3087)
@@ -1,56 +1,71 @@
-/*
- * $Id$
- *
- * JNode.org
- * Copyright (C) 2003-2006 JNode.org
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This library 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 Lesser General Public
- * License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; If not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
+/* java.lang.reflect.Field - reflection of Java fields
+ Copyright (C) 1998, 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.lang.annotation.Annotation;
+import gnu.java.lang.ClassHelper;
+import gnu.java.lang.reflect.FieldSignatureParser;
import org.jnode.vm.VmReflection;
import org.jnode.vm.classmgr.VmField;
+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>
+ * 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>
+ * <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.
+ * 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 <eb...@em...>
@@ -63,8 +78,9 @@
* @since 1.1
* @status updated to 1.4
*/
-public final class Field extends AccessibleObject implements Member, AnnotatedElement {
-
+public final class Field
+extends AccessibleObject implements Member
+{
private final VmField vmField;
private static final int FIELD_MODIFIERS
@@ -80,13 +96,13 @@
}
/**
- * Gets the class that declared this field, or the class where this field is
- * a non-inherited member.
- *
+ * 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 vmField.getDeclaringClass().asClass();
+ public Class<?> getDeclaringClass()
+ {
+ return vmField.getDeclaringClass().asClass();
}
/**
@@ -99,13 +115,8 @@
}
/**
- * 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
+ * Return the raw modifiers for this field.
+ * @return the field's modifiers
*/
public int getModifiersInternal() {
return vmField.getModifiers();
@@ -154,68 +165,82 @@
}
/**
- * 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.
+ * 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
+ * @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 this == o;
+ public boolean equals(Object o)
+ {
+ if (!(o instanceof Field))
+ return false;
+ Field that = (Field)o;
+ if (this.getDeclaringClass() != that.getDeclaringClass())
+ return false;
+ if (!this.getName().equals(that.getName()))
+ return false;
+ if (this.getType() != that.getType())
+ return false;
+ return true;
}
/**
- * 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.
+ * 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() {
- final Class<?> declClass = getDeclaringClass();
- return declClass.getName().hashCode() ^ getName().hashCode();
+ public int hashCode()
+ {
+ return getDeclaringClass().getName().hashCode() ^ getName().hashCode();
}
/**
- * Get a String representation of the Field. A Field's String representation
- * is "<modifiers> <type> <class>.<fieldname>". <br>
- * Example:
+ * 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
- StringBuffer sb = new StringBuffer(64);
+ StringBuilder sb = new StringBuilder(64);
Modifier.toString(getModifiers(), sb).append(' ');
- final Class<?> type = getType();
- final Class<?> declClass = getDeclaringClass();
- sb.append(type.getName()).append(' ');
- sb.append(declClass.getName()).append('.');
+ sb.append(ClassHelper.getUserName(getType())).append(' ');
+ sb.append(getDeclaringClass().getName()).append('.');
sb.append(getName());
return sb.toString();
}
+ public String toGenericString()
+ {
+ StringBuilder sb = new StringBuilder(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>
+ * 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>
+ * 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>
+ * 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
@@ -333,22 +358,17 @@
* 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
+ * @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
+ * @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 {
@@ -359,22 +379,17 @@
* 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
+ * @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
+ * @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 {
@@ -385,22 +400,17 @@
* 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
+ * @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
+ * @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 {
@@ -411,22 +421,17 @@
* 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
+ * @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
+ * @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 {
@@ -437,22 +442,18 @@
* 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
+ * @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
+ * @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 {
@@ -460,50 +461,41 @@
}
/**
- * 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>
+ * 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>
+ * 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
+ * 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>
+ * <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
+ * @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)
@@ -552,22 +544,17 @@
* 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
+ * @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)
@@ -579,23 +566,17 @@
* 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
+ * @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 {
@@ -606,23 +587,17 @@
* 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
+ * @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 {
@@ -633,23 +608,17 @@
* 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
+ * @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 {
@@ -660,23 +629,17 @@
* 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
+ * @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 {
@@ -687,23 +650,17 @@
* 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
+ * @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 {
@@ -714,22 +671,17 @@
* 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
+ * @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 {
@@ -740,22 +692,17 @@
* 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
+ * @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 {
@@ -763,6 +710,35 @@
}
/**
+ * 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()
+ {
+ String signature = getSignature();
+ if (signature == null)
+ return getType();
+ FieldSignatureParser 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 String getSignature() {
+ return vmField.getSignature();
+ }
+
+
+
+ /**
* @see java.lang.reflect.AnnotatedElement#getAnnotation(java.lang.Class)
*/
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
Modified: trunk/core/src/classpath/vm/java/lang/reflect/Method.java
===================================================================
--- trunk/core/src/classpath/vm/java/lang/reflect/Method.java 2007-01-20 08:55:33 UTC (rev 3086)
+++ trunk/core/src/classpath/vm/java/lang/reflect/Method.java 2007-01-27 07:54:10 UTC (rev 3087)
@@ -38,6 +38,7 @@
package java.lang.reflect;
+import gnu.java.lang.ClassHelper;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
@@ -104,7 +105,8 @@
* is a non-inherited member.
* @return the class that declared this member
*/
- public Class getDeclaringClass() {
+ public Class<?> getDeclaringClass()
+ {
return vmMethod.getDeclaringClass().asClass();
}
@@ -112,7 +114,8 @@
* Gets the name of this method.
* @return the name of this method
*/
- public String getName() {
+ public String getName()
+ {
return vmMethod.getName();
}
@@ -120,7 +123,8 @@
* Return the raw modifiers for this method.
* @return the method's modifiers
*/
- private int getModifiersInternal() {
+ private int getModifiersInternal()
+ {
return vmMethod.getModifiers();
}
@@ -172,7 +176,8 @@
* Gets the return type of this method.
* @return the type of this method
*/
- public Class getReturnType() {
+ public Class<?> getReturnType()
+ {
return vmMethod.getReturnType().asClass();
}
@@ -182,7 +187,8 @@
*
* @return a list of the types of the method's parameters
*/
- public Class[] getParameterTypes() {
+ public Class<?>[] getParameterTypes()
+ {
if (parameterTypes == null) {
int cnt = vmMethod.getNoArguments();
ArrayList<Class> list = new ArrayList<Class>(cnt);
@@ -201,7 +207,8 @@
*
* @return a list of the types in the method's throws clause
*/
- public Class[] getExceptionTypes() {
+ public Class<?>[] getExceptionTypes()
+ {
if (exceptionTypes == null) {
final VmExceptions exceptions = vmMethod.getExceptions();
final int cnt = exceptions.getLength();
@@ -234,7 +241,18 @@
* @return <code>true</code> if they are equal; <code>false</code> if not
*/
public boolean equals(Object o) {
- return (this == o);
+ if (!(o instanceof Method))
+ return false;
+ Method that = (Method)o;
+ if (this.getDeclaringClass() != that.getDeclaringClass())
+ return false;
+ if (!this.getName().equals(that.getName()))
+ return false;
+ if (this.getReturnType() != that.getReturnType())
+ return false;
+ if (!Arrays.equals(this.getParameterTypes(), that.getParameterTypes()))
+ return false;
+ return true;
}
/**
@@ -243,9 +261,9 @@
*
* @return the hash code for the object
*/
- public int hashCode() {
- final Class<?> declClass = getDeclaringClass();
- return declClass.getName().hashCode() ^ getName().hashCode();
+ public int hashCode()
+ {
+ return getDeclaringClass().getName().hashCode() ^ getName().hashCode();
}
/**
@@ -259,18 +277,17 @@
*/
public String toString() {
// 128 is a reasonable buffer initial size for constructor
- StringBuffer sb = new StringBuffer(128);
+ StringBuilder sb = new StringBuilder(128);
Modifier.toString(getModifiers(), sb).append(' ');
- final Class<?> retType = getReturnType();
- final Class<?> declClass = getDeclaringClass();
- sb.append(retType.getName()).append(' ');
- sb.append(declClass.getName()).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(c[0].getName());
+ Class[] c = getParameterTypes();
+ if (c.length > 0)
+ {
+ sb.append(ClassHelper.getUserName(c[0]));
for (int i = 1; i < c.length; i++)
- sb.append(',').append(c[i].getName());
+ sb.append(',').append(ClassHelper.getUserName(c[i]));
}
sb.append(')');
c = getExceptionTypes();
@@ -282,6 +299,33 @@
return sb.toString();
}
+ public String toGenericString()
+ {
+ // 128 is a reasonable buffer initial size for constructor
+ StringBuilder sb = new StringBuilder(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>
@@ -353,9 +397,9 @@
* Return the String in the Signature attribute for this method. If there
* is no Signature attribute, return null.
*/
- private String getSignature() {
- //todo implement it
- return null;
+ private String getSignature()
+ {
+ return vmMethod.getSignature();
}
/**
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|