пользовательская проблема classLoader - PullRequest
1 голос
/ 07 марта 2012

проблема следующая: я взял базовый код classLoader из здесь .но мой classLoader специфичен с той точки зрения, что он должен иметь возможность загружать классы из файловой системы (давайте возьмем WinOS), поэтому в classLoader должен быть какой-то setAdditionalPath() метод, который устанавливает путь (каталог в файловой системе) изкоторый мы будем загружать классом (только * .class, без банок).Вот код, который изменяет загрузчик по ссылке (вы можете видеть, что изменен только loadClass), но он не работает должным образом:

public void setAdditionalPath(String dir) {
            if(dir == null) {
                throw new NullPointerException("");
            }

            this.Path = dir;
        }

        public Loader(){
              super(Loader.class.getClassLoader());
        }


        public Class loadClass(String className) throws ClassNotFoundException {
          if(Path.length() != 0) {
            File file = new File(Path);

            try {
                // Convert File to an URL

         URL url = file.toURL();          
                URL[] urls = new URL[]{url};

                // Create a new class loader with the directory
                ClassLoader cl = new URLClassLoader(urls);


                ClassLoader c = cl.getSystemClassLoader();
                Class cls = c.loadClass(className);
                return cls;

            } catch (MalformedURLException e) {

            } catch (ClassNotFoundException e) {

            }

        }
            return findClass(Path);
        }

Буду признателен, если кто-нибудь поможет:)

1 Ответ

2 голосов
/ 08 марта 2012

Вы можете использовать только предоставленные рамки java.net.URLClassLoader. Не нужно писать свои собственные. Он поддерживает загрузку классов из каталогов и JAR-файлов.

Предполагается, что любой URL, заканчивающийся символом '/', ссылается на каталог. В противном случае предполагается, что URL ссылается на файл JAR, который будет открывается при необходимости.

Также поддерживается родительский загрузчик классов. Если этот загрузчик классов не соответствует вашим требованиям, возможно, вы сможете более подробно указать, что вам нужно. И в любом случае, вы можете посмотреть на источник и получить собственный класс загрузчика классов, основанный на этом.

Вот краткий рабочий фрагмент кода, который должен продемонстрировать, как загрузить класс по имени из URLClassLoader:

    ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

    // This URL for a directory will be searched *recursively*
    URL classes =
        new URL( "file:///D:/code/myCustomClassesAreUnderThisFolder/" );

    ClassLoader custom = 
        new URLClassLoader( new URL[] { classes }, systemClassLoader );

    // this class should be loaded from your directory
    Class< ? > clazz = custom.loadClass( "my.custom.class.Name" ); 
    // this class will be loaded as well, because you specified the system 
    // class loader as the parent
    Class< ? > clazzString = custom.loadClass( "java.lang.String" ); 
...