Каждый ClassLoader
хранит список классов, которые он загрузил до сих пор.
Если два разных ClassLoader
загружают класс с одинаковым именем, они рассматриваются средой выполнения как два отдельных несвязанных класса , Это полезно, потому что это позволяет различным версиям одного и того же класса сосуществовать во время выполнения. Например, мы можем развернуть несколько веб-приложений, разработанных разными командами, в одну и ту же JVM, каждая со своими собственными библиотеками, что освобождает разработчиков различных приложений от согласования версий используемых ими библиотек.
В вашем случае , если мы делаем new MyObject()
в классе Main
, загрузчик класса, который загрузил класс Main
, должен загрузить класс MyObject
. Это система ClassLoader
, которая ничего не знает о вашем myLoader
. Поэтому загрузчик системного класса снова загрузит класс MyObject
.
В этом можно убедиться, добавив инициализатор stati c в MyObject:
class MyObject {
static {
System.out.println("class MyObject has been loaded");
}
}