/** Returns the constant string at the specified offset */
  public static String get_constant_str(ConstantPool pool, int index) {

    Constant c = pool.getConstant(index);
    if (c instanceof ConstantUtf8) return ((ConstantUtf8) c).getBytes();
    else if (c instanceof ConstantClass) {
      ConstantClass cc = (ConstantClass) c;
      return cc.getBytes(pool) + " [" + cc.getNameIndex() + "]";
    } else assert false : "unexpected constant " + c + " class " + c.getClass();
    return (null);
  }
  /**
   * Returns all related classes
   *
   * @param start
   * @return
   */
  private static Collection<Class<?>> getAllRelatedClasses(Class<?> start) {

    List<Class<?>> rval = new ArrayList<Class<?>>();
    JavaClass lookupClass;

    // In case the class fails, return empty.
    try {
      lookupClass = Repository.lookupClass(start);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      return rval;
    }

    ConstantPool constantPool = lookupClass.getConstantPool();

    int length = constantPool.getLength();
    for (int i = 0; i < length; i++) {
      Constant constant = constantPool.getConstant(i);
      if (constant instanceof ConstantClass) {
        ConstantClass cc = (ConstantClass) constant;
        ConstantUtf8 constant2 = (ConstantUtf8) constantPool.getConstant(cc.getNameIndex());

        // In case a subclass fails, skip, but print warning.
        try {
          String toLoad = constant2.getBytes().replace('/', '.');
          if (toLoad.contains("[")) continue;
          Class<?> forName = Class.forName(toLoad);
          rval.add(forName);
        } catch (ClassNotFoundException e) {
          e.printStackTrace();
        }
      }
    }

    return rval;
  }