Реализация Java имеет выбор: загрузка класса, как только другой класс, который ссылается на него, загружен , или откладывание этого до тех пор, пока не возникнет необходимость initialize класс. В первом случае класс может сидеть в течение значительного времени (возможно, навсегда), будучи загруженным , но не инициализированным .
Напротив, существуют точные правила, когда класс инициализируется (запускаются статические инициализаторы), а именно, при первом создании объекта класса или при вызове статического метода, или не постоянное статическое поле доступно.
Единственный полностью надежный способ предотвратить попытки JVM загрузить класс - это не упомянуть об этом явно в коде и использовать Class.forName()
и отражение для запроса загрузки в определенный момент времени, в это время ClassNotFoundException
может быть брошено и обработано. Однако современные JVM обычно загружают классы гораздо более лениво, чем позволяет языковая спецификация, поэтому на практике часто будут работать более оптимистичные стратегии.
Метод «класс-обертка», описанный в вашей ссылке, не гарантированно будет работать в Java (см. §12.1.2 Спецификации языка Java, 3-е издание), но вполне возможно, что Android / Dalvik дает более строгие гарантии своей собственной .