2013-12-12 4 views
0

Я хочу осуществить PriorityClassLoader, которые могут сделать следующее:Приоритет Загрузчик классов в Java

  • Он принимает по умолчанию ClassLoader экземпляр в качестве параметра конструктора
  • имеет addURL метод, который работает как addURL в URLClassLoader, но для каждого нового URL задает приоритет.

Когда класс должен быть загружен, сначала загрузчик попытается загрузить его загрузчиком классов по умолчанию, если нет - с предоставленных URL-адресов в соответствии с приоритетом. Есть ли готовые решения?

PS - моя первоначальная проблема заключалась в следующем: я хотел добавить URL-адрес в системный загрузчик классов, но он начал терпеть неудачу в повторяющихся классах в системном загрузчике классов и удаленном JAR.

+0

Я предпочел бы унифицировать версии банку или использовать что-то вдоль линий [OSGi] (HTTP://en.wikipedia.org/wiki/OSGi) – ssedano

ответ

0

Чтобы ответить на этот вопрос, я никогда не слышал ни о каком готового решения, но это может быть сделано с помощью какой-то пользовательский загрузчик классов, это упрощенный пример из этого blog post:

public class ExampleFactory { 
    public static IExample newInstance() { 
    URLClassLoader tmp = 
     new URLClassLoader(new URL[] {getClassPath()}) { 
     public Class loadClass(String name) { 
      if ("example.Example".equals(name)) 
      return findClass(name); 
      return super.loadClass(name); 
     } 
     }; 

    return (IExample) 
     tmp.loadClass("example.Example").newInstance(); 
    } 
} 

Для исходной задачи, сделал вы пытаетесь поместить свои библиотеки в каталог endorsed? Это стандартный механизм JDK, который позволяет добавлять библиотеки на уровне загрузчика классов загрузки JVM.

В зависимости от вашего сервера были бы другие альтернативы, где размещать классы. Если ничто из этого не помогает, лучше дать дополнительную информацию об исходной проблеме.

1

Я случайно нашел эту интересную библиотеку под названием JCL, и я сделал это так:

JarClassLoader jcl = new JarClassLoader(); 
jcl.add(new URL("hive://" + pageURL.getHost() + ":" + pageURL.getPort() + "/" + pageURL.getApplicationName() + "/origJar.jar")); 

jcl.getSystemLoader().setOrder(1); 
jcl.getThreadLoader().setOrder(2); 
jcl.getCurrentLoader().setOrder(3); 
jcl.getParentLoader().setOrder(4); 
jcl.getLocalLoader().setOrder(5); 

Thread.currentThread().setContextClassLoader(jcl); 
Смежные вопросы