@SuppressWarnings({ "rawtypes", "unchecked" })
	protected synchronized Class findClass(String className) throws ClassNotFoundException {
        Class result;
        byte classData[];
        
        // Проверяем кэш классов. Если класса в кэше нет, тогда применяются другие средства
        result = (Class) cache.get(className);
        if (result != null) {
            return result;
        }

        // Проверяется нет ли такого класса в стандартном пути 
        try {
            
            // если загрузчик классов текущего потока уже является расширенным,
            // используем сохраненное значение загрузчика классов
            if (Thread.currentThread().getContextClassLoader() instanceof ExtendableClassLoader) {
                if (this.currentLoader == null) throw new ClassNotFoundException();
                else result = this.currentLoader.loadClass(className);
            } else
                result = Thread.currentThread().getContextClassLoader().loadClass(className);
            return result;
        } catch (ClassNotFoundException e) {
        } catch (Exception e) {
        }
        
        // Попытка загрузить класс из добавленного пути
        classData = getClassFromAddedClassPaths(className);
        if (classData == null) {
            throw new ClassNotFoundException();
        }

        // определение класса
        result = super.defineClass(className, classData, 0, classData.length);
        if (result == null) throw new ClassFormatError();

        resolveClass(result);

        // Полученный класс добавляется в кэш классов
        cache.put(className, result);

        return result;
    }