Класс загружается только тогда, когда вам требуется информация об этом классе.
public class SomethingCaller {
public static Something something = null; // (1) does not cause class loading
public static Class<?> somethingClass = Something.class; // (2) causes class loading
public void doSomething() {
new Something(); // (3) causes class loading
}
}
Строки (2) и (3) приведут к загрузке класса. Объект Something.class содержит информацию (строка (2)), которая может быть получена только из определения класса, поэтому вам нужно загрузить класс. Вызов конструктора (3), очевидно, требует определения класса. Аналогично для любого другого метода в классе.
Однако строка (1) не приводит к загрузке класса, поскольку на самом деле вам не нужна никакая информация, это просто ссылка на объект.
РЕДАКТИРОВАТЬ: В вашем измененном вопросе вы спрашиваете, загружает ли класс Something.class класс. Да, это так. Он не загружает класс до тех пор, пока не будет выполнен main (). Используя следующий код:
public class SomethingTest {
public static void main(String[] args) {
new SomethingCaller();
}
}
public class SomethingCaller {
public void doSomething() {
Class<?> somethingClass = Something.class;
}
}
public class Something {}
Этот код не приводит к загрузке класса Something.class. Однако, если я вызываю doSomething (), класс загружается. Чтобы проверить это, создайте перечисленные выше классы, скомпилируйте их и удалите файл Something.class. Приведенный выше код не дает сбоя с ClassNotFoundException.