4 квартал 2017 обновления: как прокомментировал ниже [1 110] vda8888, в Java 9, Система java.lang.ClassLoader
больше не java.net.URLClassLoader
.
См." руководство по миграции Java 9: Семь Наиболее распространенных проблем "
стратегия загрузки класса, которую я просто описал, реализована в новом типе и в Java 9, загрузчик класса приложений имеет тот тип.
, Который означает, это неURLClassLoader
больше, таким образом, случайное(URLClassLoader) getClass().getClassLoader()
или(URLClassLoader) ClassLoader.getSystemClassLoader()
последовательности больше не будет выполняться.
java.lang. ModuleLayer был бы альтернативным подходом, используемым для влияния modulepath (вместо пути к классу). Посмотрите, например", Java 9 модулей - основы JPMS ".
<час>Для Java 8 или ниже:
Некоторые замечания общего порядка:
Вы не можете (портативным способом, которым это, как гарантируют, будет работать, будет видеть ниже), изменяют системный путь к классу. Вместо этого необходимо определить новый ClassLoder.
ClassLoaders работают иерархическим способом... так любой класс, который делает статическую ссылку на класс X, должен быть загружен в том же ClassLoder как X, или в дочернем ClassLoder. Вы НЕ можете использовать пользовательский ClassLoder для создания кода загруженным системной ссылкой ClassLoder правильно, если это не сделало бы так прежде. Таким образом, необходимо принять меры, чтобы код главного приложения был выполнен в пользовательском ClassLoder в дополнение к дополнительному коду, которого Вы определяете местоположение.
(Однако взломанный - весь упоминания в комментариях этот пример [1 117] расширение URLClassLoader
)
И Вы могли бы рассмотреть не запись Вашего собственного ClassLoder, но просто использовать URLClassLoader вместо этого. Создайте URLClassLoader с URL, которые являются не в родителе classloaders URL.
URL[] url={new URL("file://foo")};
URLClassLoader loader = new URLClassLoader(url);
А [еще 1118] полное решение было бы:
ClassLoader currentThreadClassLoader
= Thread.currentThread().getContextClassLoader();
// Add the conf dir to the classpath
// Chain the current thread classloader
URLClassLoader urlClassLoader
= new URLClassLoader(new URL[]{new File("mtFile").toURL()},
currentThreadClassLoader);
// Replace the thread classloader - assumes
// you have permissions to do so
Thread.currentThread().setContextClassLoader(urlClassLoader);
, Если Вы принимаете систему JVMs, classloader является URLClassLoader (который не может быть верным для всего JVMs), можно использовать отражение также для фактического изменения системного пути к классу... (но это - взлом;)):
public void addURL(URL url) throws Exception {
URLClassLoader classLoader
= (URLClassLoader) ClassLoader.getSystemClassLoader();
Class clazz= URLClassLoader.class;
// Use reflection
Method method= clazz.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(classLoader, new Object[] { url });
}
addURL(new File("conf").toURL());
// This should work now!
Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");
Я не полагаю, что Вы можете - правильный поступок (я верю), создают новый classloader с новым путем. С другой стороны, Вы могли записать свой собственный classloader, который позволяет Вам изменять путь к классу (для того загрузчика) динамично.
Это возможно, как замечено от этих двух ссылок ниже, метод, который дает VonC, кажется, является лучшим, но проверяет некоторые из этих сообщений и Google для "Java Динамический Путь к классу" или "Java Динамическая Загрузка Класса" и узнает некоторую информацию оттуда.
я отправил бы в большей глубине, но VonC в значительной степени сделал задание.
От Динамическая загрузка класса и файлов .
БанкиТакже проверка этот сообщение форума солнца .
Можно хотеть изучить использование java.net. URLClassLoader. Это позволяет Вам программно загружать классы, которые не были первоначально в Вашем пути к классу, хотя я не уверен, точно ли это, в чем Вы нуждаетесь.