Когда выполняется статический блок класса? - PullRequest
67 голосов
/ 03 февраля 2012

У меня есть 2 jar, давайте назовем их a.jar и b.jar.

b.jar зависит от a.jar.

В a.jar я определил класс,давайте назовем это StaticClass.В StaticClass я определил статический блок, вызвав метод с именем "init":

public class StaticClass {
  static {
    init();
  } 

  public void static init () {
    // do some initialization here
  }
}

в b.jar, у меня есть main, поэтому в main я ожидаю, что метод init ()был вызван, но на самом деле нет.Я подозреваю, что это потому, что StaticClass не был загружен jvm, кто-нибудь может сказать мне

  1. Правильно ли сделан мой вывод?
  2. Что запускает jvm для загрузки класса?
  3. Как автоматически выполнить статический блок?

Спасибо

Ответы [ 8 ]

86 голосов
/ 03 февраля 2012

Да, вы правы.Блоки статической инициализации запускаются, когда JVM (загрузчик классов - если быть точным) загружает StaticClass (что происходит при первом обращении к нему в коде).

Вы можете вызвать этот метод, вызвав явный вызовStaticClass.init(), что предпочтительнее полагаться на JVM.

Вы также можете попробовать использовать Class.forName(String), чтобы заставить JVM загрузить класс и вызвать его статические блоки.

7 голосов
/ 03 февраля 2012

Да, вы правы, так как вы не используете StaticClass, он не загружается виртуальной машиной и, следовательно, init() никогда не выполняется.

По второму вопросу вам, вероятно, придется пройти сложный путь, отсканировать все доступные классы и загрузить их.

https://stackoverflow.com/a/3223019/393657

4 голосов
/ 03 февраля 2012

Вы правы, самый простой способ - получить доступ к классу, например, сделать

StaticClass.class.newInstance();

или что-то в этом роде в вашем основном методе.Это обеспечит загрузку класса загрузчиком классов.

3 голосов
/ 03 февраля 2012

Статический код выполняется, когда на ваш класс (StaticClass я полагаю) ссылаются.

Таким образом, он должен выполняться, если вы создаете новый экземпляр из StaticClass илиесли вы вызываете один из его статических методов .

2 голосов
/ 09 ноября 2016

Статический блок выполняется, когда загруженный класс инициализируется или на него ссылаются первыми.Загрузка класса не означает, что класс инициализируется.Загрузка класса JVM - это отдельная вещь для беспокойства.

1 голос
/ 03 февраля 2012

Да, статический инициализатор будет выполняться при загрузке класса. Обычно это происходит при первом обращении к классу в контексте загрузки классов.

0 голосов
/ 20 мая 2013

Добавление еще:

Статический блок будет выполняться при загрузке класса jvm.

Здесь в вашем примере вы можете вызвать init() метод вашего StaticClass путем создания класса

как StaticClass staticClass = new StaticClass ();

или

StaticClass.class.newInstance(); это более предпочтительный

0 голосов
/ 18 марта 2013

в классе основных методов b.jar должен расширять этот StaticClass, тогда автоматически будут вызываться статический блок и init ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...