in cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java [81:163]
public Class<?> getJavaClass(String className) {
// is there a better way to get array class from string name?
if (className == null) {
throw new NullPointerException("Null class name");
}
ClassLoader classLoader = classLoaderManager.getClassLoader(className.replace('.', '/'));
// use custom logic on failure only, assuming primitives and arrays are not that common
try {
return Class.forName(className, true, classLoader);
} catch (ClassNotFoundException e) {
if (!className.endsWith("[]")) {
switch (className) {
case "byte":
return Byte.TYPE;
case "int":
return Integer.TYPE;
case "short":
return Short.TYPE;
case "char":
return Character.TYPE;
case "double":
return Double.TYPE;
case "long":
return Long.TYPE;
case "float":
return Float.TYPE;
case "boolean":
return Boolean.TYPE;
case "void":
return Void.TYPE;
// try inner class often specified with "." instead of $
default:
int dot = className.lastIndexOf('.');
if (dot > 0 && dot + 1 < className.length()) {
className = className.substring(0, dot) + "$" + className.substring(dot + 1);
try {
return Class.forName(className, true, classLoader);
} catch (ClassNotFoundException nestedE) {
// ignore, throw the original exception...
}
}
break;
}
throw new DIRuntimeException("Invalid class: '%s'", e, className);
}
if (className.length() < 3) {
throw new IllegalArgumentException("Invalid class name: '" + className + "'");
}
// TODO: support for multi-dim arrays
className = className.substring(0, className.length() - 2);
switch (className) {
case "byte":
return byte[].class;
case "int":
return int[].class;
case "long":
return long[].class;
case "short":
return short[].class;
case "char":
return char[].class;
case "double":
return double[].class;
case "float":
return float[].class;
case "boolean":
return boolean[].class;
}
try {
return Class.forName("[L" + className + ";", true, classLoader);
} catch (ClassNotFoundException e1) {
throw new DIRuntimeException("Invalid class: '%s'", e1, className);
}
}
}