On Tue, 29 Feb 2000, Archie Cobbs wrote: > > Mo DeJong writes: > > I was just looking over the ChangeLog and I noticed that my > > Class.forName() patches never got added. I seem to remember > > that there was a problem with one of the changes in the patch. > > I am going to repost my patch minus the change that was > > causing problems and see if that is acceptable. Does anyone > > see any problems with the patch in its current form? > > I'm committing it now.. Nice catch, that should generate an error too. I added a test case for this to my forName tests and attached it to this email. Like so right? expect("[[Ljava.lang.String", "Exception"); // need ; at the end of class name Mo DeJong Red Hat Inc > Quick question: it appears that kaffe accepts "Ljava/lang/String" > even though you'd think a trailing semi-colon is required. > Is this what JDK does as well (ie, semi-colon is optional at the > end of a string)? > > -Archie
public class ArrayForName { public static void testLoadArray() throws Exception { // Loading by built-in type ID is not allowed // int != I // boolean != Z // long != J // float != F // double != D // byte != B // short != S // char != C // void != V expect("I", "Exception"); expect("Z", "Exception"); expect("J", "Exception"); expect("F", "Exception"); expect("D", "Exception"); expect("B", "Exception"); expect("S", "Exception"); expect("C", "Exception"); expect("V", "Exception"); // Not possible to load by builtin type name expect("int", "Exception"); expect("boolean", "Exception"); expect("long", "Exception"); expect("float", "Exception"); expect("double", "Exception"); expect("byte", "Exception"); expect("short", "Exception"); expect("char", "Exception"); expect("void", "Exception"); // Test loading an array by built-in type id // int[] == [I // int[][] == [[I // boolean[] == [Z // boolean[][] == [[Z // long[] == [J // long[][] == [[J // float[] == [F // float[][] == [[F // double[] == [D // double[][] == [[D // byte[] == [B // byte[][] == [[B // short[] == [S // short[][] == [[S // char[] == [C // char[][] == [[C expect("[I", "int[]"); expect("[[I", "int[][]"); expect("[Z", "boolean[]"); expect("[[Z", "boolean[][]"); expect("[J", "long[]"); expect("[[J", "long[][]"); expect("[F", "float[]"); expect("[[F", "float[][]"); expect("[D", "double[]"); expect("[[D", "double[][]"); expect("[B", "byte[]"); expect("[[B", "byte[][]"); expect("[S", "short[]"); expect("[[S", "short[][]"); expect("[C", "char[]"); expect("[[C", "char[][]"); // Array of type void is not allowed expect("[V", "Exception"); expect("[[V", "Exception"); expect("[[[V", "Exception"); // When loading an array using the built-in // type id, id must be at end of string expect("[II", "Exception"); expect("[ZZ", "Exception"); expect("[JJ", "Exception"); expect("[FF", "Exception"); expect("[DD", "Exception"); expect("[BB", "Exception"); expect("[SS", "Exception"); expect("[CC", "Exception"); expect("[ZZ", "Exception"); expect("[C;", "Exception"); expect("[C\0;", "Exception"); // [L + Class + ; // Primitive Class name is not valid expect("[Lint;", "Exception"); expect("[Lboolean;", "Exception"); expect("[Llong;", "Exception"); expect("[Lfloat;", "Exception"); expect("[Ldouble;", "Exception"); expect("[Lbyte;", "Exception"); expect("[Lshort;", "Exception"); expect("[Lchar;", "Exception"); expect("[Lvoid;", "Exception"); // java.lang.Object[] == [Ljava.lang.Object; // java.lang.Object[][] == [[Ljava.lang.Object; // java.lang.String[] == [Ljava.lang.String; // java.lang.String[][] == [[Ljava.lang.String; expect("[Ljava.lang.Object;", "java.lang.Object[]"); expect("[[Ljava.lang.Object;", "java.lang.Object[][]"); expect("[Ljava.lang.String;", "java.lang.String[]"); expect("[[Ljava.lang.String;", "java.lang.String[][]"); // L + Class must follow 0-N [ characters expect("Ljava.lang.Object;", "Exception"); expect("Ljava.lang.String;", "Exception"); // Misc invalid class names expect("L", "Exception"); expect("L;", "Exception"); expect("LS;", "Exception"); expect("[LObject;", "Exception"); expect("[[LObject;", "Exception"); expect("[LString;", "Exception"); expect("[[LString;", "Exception"); expect("[[String;", "Exception"); expect("[[Object;", "Exception"); expect("[[int;", "Exception"); expect("LString;", "Exception"); expect("L;", "Exception"); expect("[[Q", "Exception"); // array of primitive type is not allowed expect("[void", "Exception"); // array of void is not allowed expect("[[Ljava/lang/Object;", "Exception"); // classes must use . as seperator expect("[[Ljava.lang.String", "Exception"); // need ; at the end of class name expect("", "Exception"); } static void expect(String clsName, String expected) throws Exception { String result = loadByName(clsName); if (! result.equals(expected)) { StringBuffer msg = new StringBuffer(); msg.append("for clsName \"" + clsName + "\" expected \"" + expected + "\" but got \"" + result + "\""); /* throw new RuntimeException(msg.toString()); */ System.err.println(msg.toString()); } } static String loadByName(String clsName) throws Exception { try { Class c = Class.forName(clsName); if (c == null) { // This should never happen throw new NullPointerException("Class.forName(" + clsName + ") returned null"); } if (!c.isArray() && !c.isPrimitive()) { // In this case we tried to load a primitive // type by name (like "int"), but we got // an actual class that used that name. // We only try to load arrays and primitive // types in this set of tests, so just pretend // that we did not find a class named "int". return "Exception"; } return getNameFromClass( c ); } catch (IllegalArgumentException e) { // JDK 1.1 return "Exception"; } catch (ClassNotFoundException e) { // JDK 1.2 return "Exception"; } } static String getNameFromClass(Class type) { StringBuffer name = new StringBuffer(); while (type.isArray()) { name.append("[]"); type = type.getComponentType(); } name.insert(0,type.getName()); return name.toString(); } public static void main(String[] argv) throws Exception { testLoadArray(); } } /* Final output Sun % java ArrayForName Kaffe for clsName "[C" expected "Exception" but got "char[]" for clsName "[C;" expected "Exception" but got "char[]" */