Как Вы изменяете ПУТЬ К КЛАССУ в Java?

59
задан Alex Miller 22 July 2016 в 11:50
поделиться

4 ответа

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");
78
ответ дан VonC 7 November 2019 в 04:55
поделиться

Я не полагаю, что Вы можете - правильный поступок (я верю), создают новый classloader с новым путем. С другой стороны, Вы могли записать свой собственный classloader, который позволяет Вам изменять путь к классу (для того загрузчика) динамично.

3
ответ дан Jon Skeet 7 November 2019 в 04:55
поделиться

Это возможно, как замечено от этих двух ссылок ниже, метод, который дает VonC, кажется, является лучшим, но проверяет некоторые из этих сообщений и Google для "Java Динамический Путь к классу" или "Java Динамическая Загрузка Класса" и узнает некоторую информацию оттуда.

я отправил бы в большей глубине, но VonC в значительной степени сделал задание.

От Динамическая загрузка класса и файлов .

Банки

Также проверка этот сообщение форума солнца .

1
ответ дан Henry B 7 November 2019 в 04:55
поделиться

Можно хотеть изучить использование java.net. URLClassLoader. Это позволяет Вам программно загружать классы, которые не были первоначально в Вашем пути к классу, хотя я не уверен, точно ли это, в чем Вы нуждаетесь.

1
ответ дан Jack Leow 7 November 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: