code: public static Type[] getArgumentTypes(final String methodDescriptor) {
      // First step: compute the number of argument types in methodDescriptor.
      int numArgumentTypes = 0;
      // Skip the first character, which is always a '('.
      int currentOffset = 1;
      // Parse the argument types, one at a each loop iteration.
      while (methodDescriptor.charAt(currentOffset) != ')') {
        while (methodDescriptor.charAt(currentOffset) == '[') {
          currentOffset++;
        }
        if (methodDescriptor.charAt(currentOffset++) == 'L') {
          while (methodDescriptor.charAt(currentOffset++) != ';') {
            // Skip the argument descriptor content.
          }
        }
        ++numArgumentTypes;
      }
  
      // Second step: create a Type instance for each argument type.
      Type[] argumentTypes = new Type[numArgumentTypes];
      // Skip the first character, which is always a '('.
      currentOffset = 1;
      // Parse and create the argument types, one at each loop iteration.
      int currentArgumentTypeIndex = 0;
      while (methodDescriptor.charAt(currentOffset) != ')') {
        final int currentArgumentTypeOffset = currentOffset;
        while (methodDescriptor.charAt(currentOffset) == '[') {
          currentOffset++;
        }
        if (methodDescriptor.charAt(currentOffset++) == 'L') {
          while (methodDescriptor.charAt(currentOffset++) != ';') {
            // Skip the argument descriptor content.
          }
        }
        argumentTypes[currentArgumentTypeIndex++] =
            getType(methodDescriptor, currentArgumentTypeOffset, currentOffset);
      }
      return argumentTypes;
    }
docs: Returns the {@link Type} values corresponding to the argument types of the given method
  descriptor.
  
  @param methodDescriptor a method descriptor.
  @return the {@link Type} values corresponding to the argument types of the given method
  descriptor.