bayard      2005/01/26 22:45:11

  Modified:    lang/src/java/org/apache/commons/lang ClassUtils.java
               lang/src/test/org/apache/commons/lang ClassUtilsTest.java
  Log:
  added Class.forName improvement to see what people think
  
  Revision  Changes    Path
  1.35      +74 -1     
jakarta-commons/lang/src/java/org/apache/commons/lang/ClassUtils.java
  
  Index: ClassUtils.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/lang/src/java/org/apache/commons/lang/ClassUtils.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- ClassUtils.java   19 Dec 2004 22:35:38 -0000      1.34
  +++ ClassUtils.java   27 Jan 2005 06:45:11 -0000      1.35
  @@ -480,6 +480,79 @@
           }
           return convertedClasses;
       }
  +
  +    /**
  +     * <p>Enhanced version of java.lang.Class.forName(String) that can 
handle 
  +     * primitive types and arrays using the Foo[] notation. 
  +     *
  +     * @param name the fully qualified name of the class to create
  +     * @return the desired class
  +     * @since 2.1
  +     */
  +    public static Class forName(String name) throws ClassNotFoundException {
  +        String fixedName = name;
  +        if(name.endsWith("[]")) {
  +            fixedName = "[L" + name.substring(0, name.length() - 
"[]".length()) + ";";
  +        }
  +        try {
  +            return Class.forName(fixedName);
  +        } catch(ClassNotFoundException cnfe) {
  +            // try primitives
  +            if("boolean".equals(name)) {
  +                return boolean.class;
  +            } else
  +            if("char".equals(name)) {
  +                return char.class;
  +            } else
  +            if("byte".equals(name)) {
  +                return byte.class;
  +            } else
  +            if("short".equals(name)) {
  +                return short.class;
  +            } else
  +            if("int".equals(name)) {
  +                return int.class;
  +            } else
  +            if("long".equals(name)) {
  +                return long.class;
  +            } else
  +            if("float".equals(name)) {
  +                return float.class;
  +            } else
  +            if("double".equals(name)) {
  +                return double.class;
  +            }
  +
  +            // try primitive arrays
  +            if("boolean[]".equals(name)) {
  +                return boolean[].class;
  +            } else
  +            if("char[]".equals(name)) {
  +                return char[].class;
  +            } else
  +            if("byte[]".equals(name)) {
  +                return byte[].class;
  +            } else
  +            if("short[]".equals(name)) {
  +                return short[].class;
  +            } else
  +            if("int[]".equals(name)) {
  +                return int[].class;
  +            } else
  +            if("long[]".equals(name)) {
  +                return long[].class;
  +            } else
  +            if("float[]".equals(name)) {
  +                return float[].class;
  +            } else
  +            if("double[]".equals(name)) {
  +                return double[].class;
  +            }
  +
  +            throw cnfe;
  +        }
  +
  +    }
       
       // Inner class
       // ----------------------------------------------------------------------
  
  
  
  1.15      +30 -1     
jakarta-commons/lang/src/test/org/apache/commons/lang/ClassUtilsTest.java
  
  Index: ClassUtilsTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/lang/src/test/org/apache/commons/lang/ClassUtilsTest.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ClassUtilsTest.java       19 Dec 2004 22:35:38 -0000      1.14
  +++ ClassUtilsTest.java       27 Jan 2005 06:45:11 -0000      1.15
  @@ -389,6 +389,35 @@
           assertNotSame("unmodified", noPrimitives, 
ClassUtils.primitivesToWrappers(noPrimitives));
       }
   
  +    public void testForName() {
  +        String[] names = new String[] {
  +            "boolean", "char", "byte", "short", "int", "long", "float", 
"double", 
  +            "boolean[]", "char[]", "byte[]", "short[]", "int[]", "long[]", 
"float[]", "double[]", 
  +            "java.lang.Object[]", "java.lang.String", "java.lang.String[]"
  +        };
  +
  +        Class[] classes = new Class[] {
  +            boolean.class, char.class, byte.class, short.class, int.class, 
long.class, float.class, double.class, 
  +            boolean[].class, char[].class, byte[].class, short[].class, 
int[].class, long[].class, float[].class, double[].class, 
  +            Object[].class, String.class, String[].class
  +        };
  +
  +        for(int i=0; i<names.length; i++) {
  +            try {
  +                assertEquals( "Incorrect class found. ", classes[i], 
ClassUtils.forName(names[i]) );
  +            } catch(ClassNotFoundException cnfe) {
  +                fail("Failed to find class for '" + names[i] + "'");
  +            }
  +        }
  +
  +        try {
  +            ClassUtils.forName("SomeSillyMadeUpClassName");
  +            fail("Non-existent classname should have thrown an exception. ");
  +        } catch(ClassNotFoundException cnfe) {
  +            // should fail
  +        }
  +    }
  +
       public static ClassLoader newSystemClassLoader() throws  
SecurityException, IllegalArgumentException {
        ClassLoader scl = ClassLoader.getSystemClassLoader();
        if (!(scl instanceof URLClassLoader)) {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to