2013-12-12 3 views
4

Я пытаюсь загрузить класс из jar, я использую classLoader.Загрузить класс из jar

У меня есть эти части кода для подготовки ClassLoader:

private void loadClass(){ 

    try{ 
     JarFile jarFile = new JarFile(Path); 
     Enumeration e = jarFile.entries(); 

     URL[] urls = { new URL("jar:file:" + Path +"!/") }; 
     classLoader = URLClassLoader.newInstance(urls); 


    } catch (MalformedURLException ex) { 
     // TODO Auto-generated catch block 
     ex.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

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

....   
      loadClass(); 

      Class device = classLoader.loadClass("org.myPackage.MyClass"); 

      MyMotherClass Device = (MyMotherClass) device.newInstance(); 
... 

MyClass проходит от MyMotherClass, и когда Я делаю classLoader.loadClass ("org.myPackage.MyClass"), MyMotherClass находится в classLoader. На данный момент, все в порядке.

сейчас, в device.newInstance(), я получаю исключение. Проблема в том, что другие классы, используемые MyClass, не входят в путь к классам.

Что я могу сделать?

У меня есть другой метод, который загружает все необходимые классы в classLoader, но не работает, когда я получаю новый экземпляр. Я не могу изменить MyClass и другие

+0

Можете ли вы изменить настройки класса пути перед запуском JVM? – Bathsheba

+1

Это вам поможет? http://stackoverflow.com/questions/402330/is-it-possible-to-add-to-classpath-dynamically-in-java –

+0

@Bathsheba Нет, я не знаю, что банка должна быть загружена , Имя, которое оно создает во время выполнения – Clonw

ответ

2

Вот код, который я использую для динамического загрузки баночки во время выполнения. Я использую размышления, чтобы обойти тот факт, что вы не должны сделать это (т. Е. Изменить путь класса после запуска JVM). Просто измените my.proprietary.exception на что-то разумное.

/* 
    * Adds the supplied library to java.class.path. 
    * This is benign if the library is already loaded. 
    */ 
    public static synchronized void loadLibrary(java.io.File jar) throws my.proprietary.exception 
    { 
     try { 
      /*We are using reflection here to circumvent encapsulation; addURL is not public*/ 
      java.net.URLClassLoader loader = (java.net.URLClassLoader)ClassLoader.getSystemClassLoader(); 
      java.net.URL url = jar.toURI().toURL(); 
      /*Disallow if already loaded*/ 
      for (java.net.URL it : java.util.Arrays.asList(loader.getURLs())){ 
       if (it.equals(url)){ 
        return; 
       } 
      } 
      java.lang.reflect.Method method = java.net.URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{java.net.URL.class}); 
      method.setAccessible(true); /*promote the method to public access*/ 
      method.invoke(loader, new Object[]{url}); 
     } catch (final NoSuchMethodException | 
      java.lang.IllegalAccessException | 
      java.net.MalformedURLException | 
      java.lang.reflect.InvocationTargetException e){ 
      throw new my.proprietary.exception(e.getMessage()); 
     } 
    } 
+0

этот код работает отлично !! Спасибо!!! – Clonw

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