public ApiDescription parse(String apiDescription, int lineNumber) {
        Objects.requireNonNull(apiDescription, "apiDescriptionString");

        final int methodStart = apiDescription.indexOf(METHOD_PARAM_START);
        if (methodStart == -1) {
            throw new IllegalArgumentException("'(' not found. invalid apiDescriptionString:" + apiDescription);
        }

        final int methodEnd = apiDescription.indexOf(METHOD_PARAM_END, methodStart);
        if (methodEnd == -1) {
            throw new IllegalArgumentException("')' not found. invalid apiDescriptionString:" + apiDescription);
        }

        final int classIndex = apiDescription.lastIndexOf(DOT, methodStart);
        String className = getClassName(apiDescription, classIndex);
        String methodName = parseMethodName(apiDescription, methodStart, classIndex);

        String parameterDescriptor = apiDescription.substring(methodStart + 1, methodEnd);
        String[] parameterList = parseParameter(parameterDescriptor);
        String[] simpleParameterList = parseSimpleParameter(parameterList);

        String trailing = parseTailingInfo(apiDescription, methodEnd);
//            int trailingLineNumber = trailing.lastIndexOf(':');
//            if (trailingLineNumber != -1) {
//                if (LineNumber.isNoLineNumber(lineNumber)) {
//                    lineNumber = NumberUtils.parseInteger(trailing.substring(trailingLineNumber), LineNumber.NO_LINE_NUMBER);
//                }
//            }

        return new DefaultApiDescription(apiDescription, className, methodName, simpleParameterList, trailing, lineNumber);
    }
Similar to MethodDescriptor, but instead parses string-based values.
@author emeroad
commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/ApiDescriptionParser.java