Страницы

Поиск по вопросам

понедельник, 26 ноября 2018 г.

Почему обращение к SomeClass.class не вызывает инициализацию класса SomeClass?

Вопрос такой: Почему использование A.class не вызывает инициализацию класса А?
Хотя, учитывая, что подготовка класса к использованию состоит из трёх этапов, на первом из которых создаётся объект Class, и лишь третий из которых -- непосредственная инициализация, вопрос логичнее поставить так Почему вызов Class.forName("test.A"); провоцирует инициализацию класса А? Может сам метод Class.forName(String) создан так, чтобы целиком насильно загружать классы?
package test;
class A { static { System.out.println("A is initialized"); } }
public class Test{ public static void main(String[] args) throws Exception { Class c = A.class; System.out.println("whoa..."); c = Class.forName("test.A"); } }

Expected output: A is initialized whoa...
Real output: whoa... A is initialized


Ответ

В JLS 12.4.1 написано:
Invocation of certain reflective methods in class Class and in package java.lang.reflect also causes class or interface initialization.
Что в переводе:
Вызов некоторых отражающих методов в классе Class и в пакете java.lang.reflect также вызывает инициализацию класса или интерфейса.
А в этой документации для метода forName() класса Class чётко написано:
A call to forName("X") causes the class named X to be initialized.
Что в переводе:
Вызов forName («X») вызывает инициализацию класса с именем X.
Соответственно, всё оказалось верно! Метод Class.forName(String) действительно насильно загрузит класс.

Комментариев нет:

Отправить комментарий