2012-03-06 2 views
1

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

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); 
     } 

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

+0

Какую ошибку (ы), если таковые имеются, вы получаете. Это может быть сложно отладить с небольшим количеством информации. –

+0

@Legend сначала я установил значение Path с каталогом, где находятся некоторые классы. то я вызываю classloader с классом, который находится в этом каталоге, но он возвращает NPE (NullPointerException) в некоторых из этих строк 'ClassLoader cl = new URLClassLoader (urls); ClassLoader c = cl.getSystemClassLoader(); Класс cls = c.loadClass (className); ' – pikachu

+0

Я не могу сказать, что мое решение верное. основной результат, который я хочу получить, заключается в том, что мой загрузчик классов сможет загружать классы из каталога файлов, которые я установил в методе, в противном случае вызывается родительский загрузчик классов. – pikachu

ответ

1

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

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

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

Вот короткий рабочий фрагмент кода, который должен demostrate как загрузить класс по имени из 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"); 
+0

, так что это был NPE, потому что я установил путь в неправильном формате? я попробую, спасибо! – pikachu

+0

Я не знаю, но ваш пример также возвращает NPE. – pikachu

+0

Протестировал его в единичном тесте, побежал просто отлично. Измените свой вопрос, указав полную трассировку стека. – Strelok

Смежные вопросы