Как уже выше написали - метаклассы нужны чтобы в рантайме создавать другие классы. Используется например в ORM, таких как PonyORM/SQLAlchemy чтобы генерировать энтити, которые потом будут отображены на строки в таблицах в базе данных.
RootCause (или root exception) => это самое внутреннее исключение, причина.
Cause => Это соответственно объект исключения который вернет метод getCause(). Первопричина для текущего исключения.
Например, можно так добраться до RootCause:
public static Throwable getRootCause(Throwable e) {
if (e.getCause() == null) return e;
return getRootCause(e.getCause());
}