Когда класс java загружается, загружает ли этот класс только ссылку (но не экземпляр) в этом классе? Я считаю, что он не загружается до тех пор, пока ссылочный класс не будет создан или какое-либо статическое поле будет присвоено значение. Однако я узнал, что это поведение меняет JVM на JVM. Это правда?Когда класс java загружается, загружает ли этот класс только ссылку (но не экземпляр) в этом классе?
Когда класс java загружается, загружает ли этот класс только ссылку (но не экземпляр) в этом классе?
ответ
Эти два перегруженных метода загружают класс.
loadClass(name, resolve);
loadClass(name);
Здесь разрешено булевский флаг, и когда оно истинно, оно также разрешит все ссылочные классы. Когда это ложно, это классы, на которые не ссылаются нагрузки.
Обратите внимание, что для любого класса, который вы загрузите, переменная разрешения всегда будет правдой. Только тогда, когда система рекурсивно вызывает loadClass(), она может установить эту переменную false, поскольку она знает, что класс, который он запрашивает, уже разрешен.
Here, loadClass(name); calls loadClass(name, false);
Занятия загружаются только при их получении .
Довольно легко сделать ваши собственные эксперименты «доказанными» тем, что, используя ClassLoader, распечатайте то, что он делает; см. here, как это работает.
I думаю что это указано property of JVM; значение: все JVM должны делать это таким образом (см. here).
И вы видите - ничего другого не имеет смысла. Некоторые классы A могут ссылаться на 10, 20 других классов. Вы действительно хотите загрузить все эти классы, когда загружается A? И все 10, 20 классов, на которые ссылаются ссылки А? Не зная, будете ли вы когда-нибудь в этом нуждаться ?!
Прочитайте спецификацию Java Language и спецификацию JVM, чтобы узнать глубинные сложности загрузки классов. Вопрос слишком широк для StackOverflow и уже хорошо документирован в другом месте. –