public static Object newInstance(Class<?> clazz, Object... args) {
        var argTypes = new Class<?>[args.length];
        for (int i = 0; i < args.length; i++) {
            argTypes[i] = args[i].getClass();
        }
        Constructor<?> ctor = getConstructor(clazz, argTypes);
        return instantiate(ctor, args);
    }
Attempts to load the specified class name from the current thread's
{@link Thread#getContextClassLoader() context class loader}, then the
current ClassLoader (<code>ClassUtils.class.getClassLoader()</code>), then the system/application
ClassLoader (<code>ClassLoader.getSystemClassLoader()</code>, in that order.  If any of them cannot locate
the specified class, an <code>UnknownClassException</code> is thrown (our RuntimeException equivalent of
the JRE's <code>ClassNotFoundException</code>.

@param fqcn the fully qualified class name to load
@return the located class
@throws UnknownClassException if the class cannot be found.
lang/src/main/java/org/apache/shiro/lang/util/ClassUtils.java