Ответ 1
Класс загружается только тогда, когда вам требуется информация об этом классе.
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) не вызывает загрузку класса, поскольку на самом деле вам не нужна какая-либо информация, это просто ссылка на объект.
EDIT: в вашем измененном вопросе вы спрашиваете, ссылается ли на 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.