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

186
11 сентября 2017, 03:56

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

В JLS 12.4.1 написано, что статическая инициализация происходит перед:

  • Созданием экземпляра класса;
  • Вызовом статического метода класса;
  • Присвоением статического поля класса;
  • Использованием неконстантного статического поля класса;
  • Выполнением оператора assert в классах верхнего уровня.

А при вызове метода forName() ClassLoader осуществляет принудительную инициализацию.

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

READ ALSO
Не обновляется время в классе, вызваном циклом Java

Не обновляется время в классе, вызваном циклом Java

ЗдравствуйтеПри вызове (int) (System

345
SAXParser проблема с кодровкой

SAXParser проблема с кодровкой

Пытаюсь распарсить файл, java SAXParser

242
Как можно реализовать общение между java и php?

Как можно реализовать общение между java и php?

Я знаю php, мой друг изучает java, мы хотели бы сделать общение между php и java, но не знаем как, хотелось бы передавать переменные, массивы, чтобы...

191
Интерфейс базы данных в Android

Интерфейс базы данных в Android

Есть база данных и много Фрагментов и Активностей, где ее нужно использоватьМожно ли отдельно создать или интерфейс или класс, где заранее...

235