code: public Object readConst(final int item, final char[] buf) {
          int index = items[item];
          switch (b[index - 1]) {
          case ClassWriter.INT:
              return readInt(index);
          case ClassWriter.FLOAT:
              return Float.intBitsToFloat(readInt(index));
          case ClassWriter.LONG:
              return readLong(index);
          case ClassWriter.DOUBLE:
              return Double.longBitsToDouble(readLong(index));
          case ClassWriter.CLASS:
              return Type.getObjectType(readUTF8(index, buf));
          case ClassWriter.STR:
              return readUTF8(index, buf);
          case ClassWriter.MTYPE:
              return Type.getMethodType(readUTF8(index, buf));
          default: // case ClassWriter.HANDLE_BASE + [1..9]:
              int tag = readByte(index);
              int[] items = this.items;
              int cpIndex = items[readUnsignedShort(index + 1)];
              String owner = readClass(cpIndex, buf);
              cpIndex = items[readUnsignedShort(cpIndex + 2)];
              String name = readUTF8(cpIndex, buf);
              String desc = readUTF8(cpIndex + 2, buf);
              return new Handle(tag, owner, name, desc);
          }
      }
docs: Reads a numeric or string constant pool item in {@link #b b}. <i>This
  method is intended for {@link Attribute} sub classes, and is normally not
  needed by class generators or adapters.</i>
  
  @param item
  the index of a constant pool item.
  @param buf
  buffer to be used to read the item. This buffer must be
  sufficiently large. It is not automatically resized.
  @return the {@link Integer}, {@link Float}, {@link Long}, {@link Double},
  {@link String}, {@link Type} or {@link Handle} corresponding to
  the given constant pool item.