@SuppressWarnings("unchecked")
    public static <T> Class<T> forName(String fqcn) throws UnknownClassException {
        Class<?> clazz = THREAD_CL_ACCESSOR.loadClass(fqcn);

        if (clazz == null) {
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Unable to load class named [" + fqcn
                        + "] from the thread context ClassLoader.  Trying the current ClassLoader...");
            }
            clazz = CLASS_LANG_CL_ACCESSOR.loadClass(fqcn);
        }

        if (clazz == null) {
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Unable to load class named [" + fqcn
                        + "] from the org.apache.shiro.lang ClassLoader.  Trying the additionally set ClassLoader...");
            }
            clazz = ADDITIONAL_CL_ACCESSOR.loadClass(fqcn);
        }

        if (clazz == null) {
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Unable to load class named [" + fqcn + "] from the current ClassLoader.  "
                        + "Trying the system/application ClassLoader...");
            }
            clazz = SYSTEM_CL_ACCESSOR.loadClass(fqcn);
        }

        if (clazz == null) {
            //SHIRO-767: support for getting primitive data type,such as int,double...
            clazz = PRIM_CLASSES.get(fqcn);
        }

        if (clazz == null) {
            String msg = "Unable to load class named [" + fqcn + "] from the thread context, current, or "
                    + "system/application ClassLoaders.  All heuristics have been exhausted.  Class could not be found.";
            throw new UnknownClassException(msg);
        }

        return (Class<T>) clazz;
    }
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