diff --git a/classpath/java/lang/Class.java b/classpath/java/lang/Class.java index 225680a66b..59099310dc 100644 --- a/classpath/java/lang/Class.java +++ b/classpath/java/lang/Class.java @@ -105,7 +105,7 @@ public final class Class { public Class getComponentType() { if (isArray()) { - return (Class) (Object) staticTable; + return (Class) staticTable; } else { return null; } @@ -279,9 +279,10 @@ public final class Class { public Field[] getFields() { Field[] array = new Field[countPublicFields()]; if (fieldTable != null) { + int ai = 0; for (int i = 0; i < fieldTable.length; ++i) { if (((fieldTable[i].getModifiers() & Modifier.PUBLIC)) != 0) { - array[i] = fieldTable[i]; + array[ai++] = fieldTable[i]; } } } @@ -306,10 +307,10 @@ public final class Class { public Method[] getDeclaredMethods() { Method[] array = new Method[countMethods(false)]; if (methodTable != null) { - int index = 0; + int ai = 0; for (int i = 0; i < methodTable.length; ++i) { if (! methodTable[i].getName().startsWith("<")) { - array[index++] = methodTable[i]; + array[ai++] = methodTable[i]; } } } @@ -346,7 +347,7 @@ public final class Class { } public T[] getEnumConstants() { - if (isAssignableFrom(Enum.class)) { + if (Enum.class.isAssignableFrom(this)) { try { return (T[]) getMethod("values").invoke(null); } catch (Exception e) { @@ -374,7 +375,7 @@ public final class Class { } public boolean isInstance(Object o) { - return isAssignableFrom(o.getClass()); + return o != null && isAssignableFrom(o.getClass()); } public boolean isPrimitive() { diff --git a/classpath/java/lang/reflect/Array.java b/classpath/java/lang/reflect/Array.java index 06d99e20d3..4d8f7c2515 100644 --- a/classpath/java/lang/reflect/Array.java +++ b/classpath/java/lang/reflect/Array.java @@ -68,10 +68,14 @@ public final class Array { break; case 'L': case '[': - if (array.getClass().getComponentType().isInstance(value)) { + if (value == null + || array.getClass().getComponentType().isInstance(value)) + { ((Object[]) array)[index] = value; } else { - throw new IllegalArgumentException(); + throw new IllegalArgumentException + ("need " + array.getClass().getComponentType() + + ", got " + value.getClass().getName()); } break; diff --git a/classpath/java/lang/reflect/Field.java b/classpath/java/lang/reflect/Field.java index 22bf1c9af7..2b2bacfbdc 100644 --- a/classpath/java/lang/reflect/Field.java +++ b/classpath/java/lang/reflect/Field.java @@ -43,7 +43,7 @@ public class Field extends AccessibleObject { } public Class getType() { - return Class.forCanonicalName(getName()); + return Class.forCanonicalName(new String(spec, 0, spec.length - 1, false)); } public Object get(Object instance) throws IllegalAccessException { @@ -139,10 +139,11 @@ public class Field extends AccessibleObject { break; case ObjectField: - if (getType().isInstance(value)) { + if (value == null || getType().isInstance(value)) { setObject(target, offset, value); } else { - throw new IllegalArgumentException(); + throw new IllegalArgumentException + ("need " + getType() + ", got " + value.getClass().getName()); } break;