Будет ли загруженный метод библиотеки использоваться без перекомпиляции? - PullRequest
1 голос
/ 24 мая 2011

Скажите, что в библиотеке был метод

public static <E> void doSmth(Collection<E> foo, Collection<E> bar){...}

и использовался в следующем коде:

Set<Object> foo = ...;
List<Object> bar = ...;
doSmth(foo, bar);

Теперь другая версия библиотеки заменяет первую в classpath и имеет два метода:

public static <E> void doSmth(Collection<E> foo, Collecion<E> bar){...}
public static <E> void doSmth(Set<E> foo, List<E> bar){...}

Приложение не перекомпилировано и не запущено. Какой метод будет использован?

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Разрешение перегрузки является процессом времени компиляции, поэтому его результат не может измениться без перекомпиляции.

Итак, будет использоваться

public static <E> void doSmth(Collection<E> foo, Collecion<E> bar){...}

, поскольку его подпись указана в скомпилированном файле.

1 голос
/ 24 мая 2011

Библиотека не содержит методов , классы содержат. И классы загружаются загрузчиком классов, когда они нужны в первый раз.

Классы (обычно) загружаются в том же порядке, в котором они отображаются в пути к классам. Обычно только потому, что модные пользовательские загрузчики классов могут реализовывать другие стратегии.

Итак, к вашему вопросу, и рассмотрим нормальное поведение: если у нас есть два класса с одинаковым именем на пути, один содержит два, другой метод, то только загружен один класс, который тот, который загрузчики классов находят первым. Как только класс загружен, нет необходимости (одному и тому же) загрузчику классов снова искать класс с тем же именем.


Перегрузка определяется статически во время компиляции, поэтому будет по-прежнему вызываться метод 1.

1 голос
/ 24 мая 2011

Если у вас есть 2 версии одной и той же библиотеки в пути к классам, трудно сказать, какая из них будет загружаться загрузчиком классов в первую очередь (и, следовательно, какая из них будет использоваться) - фактически шансы на то, что результаты будут отличаться от машины к машине и JVMв JVM.Если вам сначала нужно загрузить определенную версию, вы можете добавить ее в параметр bootclasspath через -Xbootclasspath в командной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...