docs: private static Class<?> name2class(ClassLoader cl, String name)
  			throws ClassNotFoundException {
  		int c = 0, index = name.indexOf('[');
  		if (index > 0) {
  			c = (name.length() - index) / 2;
  			name = name.substring(0, index);
  		}
  		if (c > 0) {
  			StringBuilder sb = new StringBuilder();
  			while (c-- > 0)
  				sb.append("[");
  
  			if ("void".equals(name))
  				sb.append(JVM_VOID);
  			else if ("boolean".equals(name))
  				sb.append(JVM_BOOLEAN);
  			else if ("byte".equals(name))
  				sb.append(JVM_BYTE);
  			else if ("char".equals(name))
  				sb.append(JVM_CHAR);
  			else if ("double".equals(name))
  				sb.append(JVM_DOUBLE);
  			else if ("float".equals(name))
  				sb.append(JVM_FLOAT);
  			else if ("int".equals(name))
  				sb.append(JVM_INT);
  			else if ("long".equals(name))
  				sb.append(JVM_LONG);
  			else if ("short".equals(name))
  				sb.append(JVM_SHORT);
  			else
  				sb.append('L').append(name).append(';'); // "java.lang.Object"
  															// ==>
  															// "Ljava.lang.Object;"
  			name = sb.toString();
  		} else {
  			if ("void".equals(name))
  				return void.class;
  			else if ("boolean".equals(name))
  				return boolean.class;
  			else if ("byte".equals(name))
  				return byte.class;
  			else if ("char".equals(name))
  				return char.class;
  			else if ("double".equals(name))
  				return double.class;
  			else if ("float".equals(name))
  				return float.class;
  			else if ("int".equals(name))
  				return int.class;
  			else if ("long".equals(name))
  				return long.class;
  			else if ("short".equals(name))
  				return short.class;
  		}
  
  		if (cl == null)
  			cl = getClassLoader();
  		Class<?> clazz = NAME_CLASS_CACHE.get(name);
  		if (clazz == null) {
  			clazz = Class.forName(name, true, cl);
  			NAME_CLASS_CACHE.put(name, clazz);
  		}
  		return clazz;
  	}