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]