Index: vm/reference/java/lang/Class.java =================================================================== RCS file: /cvs/classpath/vm/reference/java/lang/Class.java,v retrieving revision 1.11 diff -u -r1.11 Class.java --- vm/reference/java/lang/Class.java 2001/01/09 23:35:07 1.11 +++ vm/reference/java/lang/Class.java 2001/04/26 01:01:13 @@ -244,26 +244,62 @@ */ public native boolean isPrimitive(); - /** - * If this is an array, get the Class representing the - * type of array. Examples: [[java.lang.String would - * return [java.lang.String, and calling getComponentType - * on that would give java.lang.String. If this is not - * an array, returns null. - * @return the array type of this class, or null. - * @since JDK1.1 - */ - public Class getComponentType() { - if(isArray()) { - try { - return Class.forName(getName().substring(1)); - } catch(ClassNotFoundException e) { - return null; + /** If this is an array, get the Class representing the + ** type of array. Examples: [[Ljava.lang.String; would + ** return [Ljava.lang.String;, and calling getComponentType + ** on that would give java.lang.String. If this is not + ** an array, returns null. + ** @return the array type of this class, or null. + ** @since JDK1.1 + **/ + public Class getComponentType() + { + if(isArray()) + { + String name = getName(); + try { + if(name.charAt(0) != '[') + throw new InternalError("Bad array class name encountered in Class.getComponentType(): \"" + name + "\", doesn't start with '['"); + try { + /* Check it is an object array */ + if(name.charAt(1) == 'L') + return Class.forName(name.substring(2, name.length() - 1)); + /* Check it is a nested array */ + if(name.charAt(1) == '[') + return Class.forName(name.substring(1)); + /* Check for primitive types */ + switch(name.charAt(1)) + { + case 'Z': + return Boolean.TYPE; + case 'B': + return Byte.TYPE; + case 'C': + return Character.TYPE; + case 'S': + return Short.TYPE; + case 'I': + return Integer.TYPE; + case 'J': + return Long.TYPE; + case 'F': + return Float.TYPE; + case 'D': + return Double.TYPE; + } + /* If we get here then the classname is incorrect */ + throw new InternalError("Bad class name encountered in Class.getComponentType(): \"" + name + "\""); + } catch(ArrayIndexOutOfBoundsException _) + { + throw new InternalError("Bad class name encountered in Class.getComponentType(): \"" + name + "\", '[' not followed by anything"); + } + } catch(ClassNotFoundException __) + { + return null; + } } - } else { - return null; + return null; } - } /** * Get the signers of this class.