Вопрос такой: Почему использование 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 написано, что статическая инициализация происходит перед:
assert
в классах верхнего уровня.А при вызове метода forName()
ClassLoader осуществляет принудительную инициализацию.
В 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)
действительно насильно загрузит класс.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я знаю php, мой друг изучает java, мы хотели бы сделать общение между php и java, но не знаем как, хотелось бы передавать переменные, массивы, чтобы...
Есть база данных и много Фрагментов и Активностей, где ее нужно использоватьМожно ли отдельно создать или интерфейс или класс, где заранее...