docs: private Object readAnnotationElementValue() throws IOException {
          final int tag = (char) inputStreamOrByteBuffer.readUnsignedByte();
          switch (tag) {
          case 'B':
              return (byte) cpReadInt(inputStreamOrByteBuffer.readUnsignedShort());
          case 'C':
              return (char) cpReadInt(inputStreamOrByteBuffer.readUnsignedShort());
          case 'D':
              return Double.longBitsToDouble(cpReadLong(inputStreamOrByteBuffer.readUnsignedShort()));
          case 'F':
              return Float.intBitsToFloat(cpReadInt(inputStreamOrByteBuffer.readUnsignedShort()));
          case 'I':
              return cpReadInt(inputStreamOrByteBuffer.readUnsignedShort());
          case 'J':
              return cpReadLong(inputStreamOrByteBuffer.readUnsignedShort());
          case 'S':
              return (short) cpReadUnsignedShort(inputStreamOrByteBuffer.readUnsignedShort());
          case 'Z':
              return cpReadInt(inputStreamOrByteBuffer.readUnsignedShort()) != 0;
          case 's':
              return getConstantPoolString(inputStreamOrByteBuffer.readUnsignedShort());
          case 'e': {
              // Return type is AnnotationEnumVal.
              final String annotationClassName = getConstantPoolClassDescriptor(
                      inputStreamOrByteBuffer.readUnsignedShort());
              final String annotationConstName = getConstantPoolString(inputStreamOrByteBuffer.readUnsignedShort());
              return new AnnotationEnumValue(annotationClassName, annotationConstName);
          }
          case 'c':
              // Return type is AnnotationClassRef (for class references in annotations)
              final String classRefTypeDescriptor = getConstantPoolString(
                      inputStreamOrByteBuffer.readUnsignedShort());
              return new AnnotationClassRef(classRefTypeDescriptor);
          case '@':
              // Complex (nested) annotation. Return type is AnnotationInfo.
              return readAnnotation();
          case '[':
              // Return type is Object[] (of nested annotation element values)
              final int count = inputStreamOrByteBuffer.readUnsignedShort();
              final Object[] arr = new Object[count];
              for (int i = 0; i < count; ++i) {
                  // Nested annotation element value
                  arr[i] = readAnnotationElementValue();
              }
              return arr;
          default:
              throw new ClassfileFormatException("Class " + className + " has unknown annotation element type tag '"
                      + ((char) tag) + "': element size unknown, cannot continue reading class. "
                      + "Please report this at https://github.com/classgraph/classgraph/issues");
          }
      }