static Type getTypeInternal(
            final String descriptorBuffer, final int descriptorBegin, final int descriptorEnd) {
        switch (descriptorBuffer.charAt(descriptorBegin)) {
            case 'V':
                return VOID_TYPE;
            case 'Z':
                return BOOLEAN_TYPE;
            case 'C':
                return CHAR_TYPE;
            case 'B':
                return BYTE_TYPE;
            case 'S':
                return SHORT_TYPE;
            case 'I':
                return INT_TYPE;
            case 'F':
                return FLOAT_TYPE;
            case 'J':
                return LONG_TYPE;
            case 'D':
                return DOUBLE_TYPE;
            case '[':
                return new Type(ARRAY, descriptorBuffer, descriptorBegin, descriptorEnd);
            case 'L':
                int len = descriptorEnd - descriptorBegin;
                switch (len) {
                    case 16:
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_LIST.valueBuffer, 0, len)) {
                            return TYPE_LIST;
                        }
                        break;
                    case 17:
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_CLASS.valueBuffer, 0, len)) {
                            return TYPE_CLASS;
                        }
                        break;
                    case 18:
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_STRING.valueBuffer, 0, len)) {
                            return TYPE_STRING;
                        }
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_OBJECT.valueBuffer, 0, len)) {
                            return TYPE_OBJECT;
                        }
                        break;
                    case 24:
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_TYPE.valueBuffer, 0, len)) {
                            return TYPE_TYPE;
                        }
                        break;
                    case 29:
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_SUPPLIER.valueBuffer, 0, len)) {
                            return TYPE_SUPPLIER;
                        }
                        break;
                    case 34:
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_JSON_WRITER.valueBuffer, 0, len)) {
                            return TYPE_JSON_WRITER;
                        }
                        if (descriptorBuffer.regionMatches(descriptorBegin, TYPE_JSON_READER.valueBuffer, 0, len)) {
                            return TYPE_JSON_READER;
                        }
                        break;
                    default:
                        break;
                }

                return new Type(OBJECT, descriptorBuffer, descriptorBegin + 1, descriptorEnd - 1);
            case '(':
                return new Type(METHOD, descriptorBuffer, descriptorBegin, descriptorEnd);
            default:
                throw new IllegalArgumentException();
        }
    }
Returns the {@link Type} corresponding to the given field or method descriptor.

@param descriptorBuffer a buffer containing the field or method descriptor.
@param descriptorBegin  the beginning index, inclusive, of the field or method descriptor in
                        descriptorBuffer.
@param descriptorEnd    the end index, exclusive, of the field or method descriptor in
                        descriptorBuffer.
@return the {@link Type} corresponding to the given type descriptor.
core/src/main/java/com/alibaba/fastjson2/internal/asm/Type.java