Недавно я начал изучать, как именно работает загрузчик классов в Java.Ниже приведены три пункта, которые я наблюдал:
Точка-1: У каждого загрузчика классов есть родительский загрузчик классов.Когда загрузчику классов предлагается загрузить класс или ресурс, он обращается к своему родительскому загрузчику классов, прежде чем пытаться загрузить сам элемент.Родитель, в свою очередь, консультируется со своим родителем и так далее.Таким образом, только после того, как все загрузчики класса-предка не могут найти элемент, текущий загрузчик класса включается.
Point-2: один и тот же класс, загруженный двумя загрузчиками, рассматривается как два разных классаюридическое лицо.мы даже не можем привести один объект класса (loader 1) к другому классу (загруженному loader2).он выдаст ClassCastException.
Точка-3: Загрузчик дочернего класса может проверить кэш загрузчика родительского класса, но родитель не может видеть классы, загруженные дочерним элементом.
Исходя из вышеизложенного, у меня есть два вопроса:
Ситуация: Я создал объект URLClassloader url1 и другой объект URLClassloader url2 в том же приложении.как мы знаем, по умолчанию оба загрузчика классов будут иметь один и тот же родительский загрузчик классов.просто предположим, что загрузчик родительского класса - это SystemClassLoader.
Вопрос 1: url1 classloader загрузил класс A.class из местоположения x / abc.jar.снова url2 хочет загрузить тот же класс из того же места.будет ли url2 загружать свежее или будет использовать тот же, что загружен url1?Я пытался проверить, только когда исполнялся статический блок, поэтому загруженный класс загружался только один раз.что, согласно моему пониманию, не удовлетворяет пункту 1 и пункту 3.
Вопрос 2: Может ли загрузчик классов url2 проверить кэш загрузчика классов url1.относится к точке-3.