Страницы

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

вторник, 24 декабря 2019 г.

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

#java #rtti


Вопрос такой: Почему использование 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

    


Ответы

Ответ 1



В JLS 12.4.1 написано, что статическая инициализация происходит перед: Созданием экземпляра класса; Вызовом статического метода класса; Присвоением статического поля класса; Использованием неконстантного статического поля класса; Выполнением оператора assert в классах верхнего уровня. А при вызове метода forName() ClassLoader осуществляет принудительную инициализацию.

Ответ 2



В 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) действительно насильно загрузит класс.

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

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