private static <T> T instantiate(Class<T> classType, String classname) throws IOException {
    T t;
    try {
      Class<?> c = JavaUtils.loadClass(classname);
      Object o = c.newInstance();
      if (classType.isAssignableFrom(o.getClass())) {
        t = (T)o;
      } else {
        String s = classname + " is not an instance of " + classType.getName();
        LOG.error(s);
        throw new IOException(s);
      }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
      LOG.error("Unable to instantiate class", e);
      throw new IOException(e);
    }
    return t;
  }
This input format returns its own input split as a value.  This is because our splits
contain information needed to properly construct the writer.  Crazy, huh?
ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/MRCompactor.java