public static TableName valueOf(byte[] fullName, int offset, int length)
    throws IllegalArgumentException {
    Preconditions.checkArgument(offset >= 0, "offset must be non-negative but was %s", offset);
    Preconditions.checkArgument(offset < fullName.length, "offset (%s) must be < array length (%s)",
      offset, fullName.length);
    Preconditions.checkArgument(length <= fullName.length,
      "length (%s) must be <= array length (%s)", length, fullName.length);
    for (TableName tn : tableCache) {
      final byte[] tnName = tn.getName();
      if (Bytes.equals(tnName, 0, tnName.length, fullName, offset, length)) {
        return tn;
      }
    }

    int namespaceDelimIndex =
      ArrayUtils.lastIndexOf(fullName, (byte) NAMESPACE_DELIM, offset + length - 1);

    if (namespaceDelimIndex < offset) {
      return createTableNameIfNecessary(ByteBuffer.wrap(NamespaceDescriptor.DEFAULT_NAMESPACE_NAME),
        ByteBuffer.wrap(fullName, offset, length));
    } else {
      return createTableNameIfNecessary(ByteBuffer.wrap(fullName, offset, namespaceDelimIndex),
        ByteBuffer.wrap(fullName, namespaceDelimIndex + 1, length - (namespaceDelimIndex + 1)));
    }
  }
Construct a TableName
@param fullName byte array to look into
@param offset   within said array
@param length   within said array
@throws IllegalArgumentException if fullName equals old root or old meta.
hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java