Я пытаюсь понять, как работает загрузчик классов. Я создал простое тестовое приложение и запустил его в режиме -verbose: class. У меня есть интерфейс и класс.
Интерфейс
public interface Animal {
int h = 8;
}
Класс
public class Elephant implements Animal {
static int staticInt;
static void initTest(){
System.out.println("HELLO");
}
}
Я запускаю указанную ниже команду в основном приложении и получаю ожидаемый результат. И интерфейс, и класс загружаются в память, поскольку я получил доступ к полю stati c класса Elephant
int i = Elephant.staticInt;
[0.795s][info][class,load] classloader.test.Animal source: file:/C:/study/class-loader/out/production/class-loader/
[0.795s][info][class,load] classloader.test.Elephant source: file:/C:/study/class-loader/out/production/class-loader/
Когда я запускаю приведенный ниже код, я вижу, что загружен только класс Animal, который я тоже ожидаю.
Animal.class.getClassLoader();
[0.864s][info][class,load] classloader.test.Animal source: file:/C:/study/class-loader/out/production/class-loader/
Проблема в том, что когда я получаю доступ только к полю интерфейса, я не вижу вывода загрузки класса в моей консоли. По-разному загружаются интерфейсы? Как я могу получить доступ к целочисленному значению, если оно не загружено? Я не смог найти ничего по этой теме.
//When i run the below code i only get the value of the integer but not the class loading info
System.out.println("The integer is " + Animal.h);
The integer is 8
Примечание: все три случая рассматривались отдельно