2015-05-02 2 views
1

Я создаю новый классLoader с помощью URLClassLoader и пытаюсь установить его как classLoader для текущего потока. Но он не работает должным образом для меня. Как я понимаю, если бы я установил classLoader в текущий поток, методы и интерфейсы, на которые ссылается текущий поток, должны быть из текущего классаLoader. Но это не тот случай со мной. Метод взят из другой банки, и я получаю classCastExecption. Ниже приводится код для получения ClassLoader:Классы ClassLoader неправильно загружены в поток

public ClassLoader getClassLoader(boolean b) { 

    ClassLoader loader = null; 
    File file = new File(SamVariables.JAR_FILE); 
    if (file.exists()){ 


       try { 
      List<URL> urlsList = new ArrayList<URL>(); 
      urlsList.add(file.toURI().toURL()); 
      URL[] urls = new URL[urlsList.size()]; 
      urlsList.toArray(urls); 
      URLClassLoader url = new URLClassLoader(urls); 


      try { 
       loader = Class.forName("org.jboss.naming.remote.client.InitialContextFactory", false, url).getClassLoader(); 

      } catch (ClassNotFoundException e) { 
       loader = Class.forName("org.jboss.jms.client.JBossConnectionFactory", false, url).getClassLoader(); 
      } 
      } 

     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 

    } 
    return loader; // I am successfully getting the classLoader for the class 

} 

I set it to the current thread 

    Thread.currentThread().setContextClassLoader(getClassLoader); 

But later when I try to get the topicConnectionFactory object, it gives me typecast exception: 

topicConnectionFactory = (TopicConnectionFactory) topicConnectionFactObj; 

Это дает мне ClassCastException.

Когда я проверил объект TopicConnectionFactory, он исходит из другого файла jar, который вызывает проблему.

ответ

1

Согласно моему пониманию, если я поставил ClassLoader к текущему потоку, методы и интерфейсы, на которые ссылается текущий поток должен быть из настоящего ClassLoader.

Нет, это заблуждение. Загрузчик класса контекста не используется, если только код не использует его специально. В частности, загрузчик контекстного класса не используется JVM (но он используется определенными API-интерфейсами, такими как поиск реализации XML-парсера). Вместо этого используется загрузчик классов исходного класса.

Если вы хотите, чтобы ваш код мог загружать классы из пользовательского загрузчика классов, вы должны загрузить свои классы в этом загрузчике классов. Например, поместите эти классы в отдельный JAR, поместите этот JAR в путь класса URLClassLoader и используйте отражение для загрузки/вызова вашего класса из этого URLClassLoader.

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