code: public static String toClassName(final String type) {
          switch (type.charAt(0)) {
              case 'V':
                  return CLASS_PRIMITIVE_VOID;
              case 'Z':
                  return CLASS_PRIMITIVE_BOOLEAN;
              case 'C':
                  return CLASS_PRIMITIVE_CHAR;
              case 'B':
                  return CLASS_PRIMITIVE_BYTE;
              case 'S':
                  return CLASS_PRIMITIVE_SHORT;
              case 'I':
                  return CLASS_PRIMITIVE_INT;
              case 'F':
                  return CLASS_PRIMITIVE_FLOAT;
              case 'J':
                  return CLASS_PRIMITIVE_LONG;
              case 'D':
                  return CLASS_PRIMITIVE_DOUBLE;
              case 'L':
                  final int typeParamStart = type.indexOf('<');
                  final int endIndex = typeParamStart >= 0 ? typeParamStart : type.indexOf(';');
                  return type.substring(1, endIndex);
              case '[':
              case '+':
              case '-':
                  return toClassName(type.substring(1));
              case 'T':
                  // TODO handle type variables
                  return CLASS_OBJECT;
              default:
                  throw new IllegalArgumentException("Not a type signature: " + type);
          }
      }
docs: Converts the given JVM object type signature to a class name. Erasures parametrized types.
  <p>
  Example: {@code Ljava/util/List<Ljava/lang/String;>; -> java/util/List}
  
  @throws IllegalArgumentException If the type is not a reference or array type.