2012-02-03 4 views
58

У меня есть 2 баночки, назовем их 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, у меня есть основной, так в основном, я ожидаю, что метод Init() был но на самом деле нет. Я подозреваю, что это потому, что StaticClass не загружен jvm, может ли кто-нибудь сказать мне

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

Благодаря

+3

Вам нужно будет использовать свой StaticClass somwhere, чтобы он был загружен и инициализирован. – Kris

+3

Похоже, [это] (http://stackoverflow.com/questions/3499214/java-static-class-initialization) может ответить на ваш вопрос. –

+0

Возможный дубликат: http://stackoverflow.com/questions/2007666/in-what-order-do-static-initializer-blocks-in-java-run –

ответ

69

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

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

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

+0

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

+3

"статические блоки инициализации запускаются, когда JVM загружает StaticClass' - некорректно, загрузка классов отличается от инициализации класса. –

+2

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

3

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

StaticClass.class.newInstance();

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

+0

@ TomHawtin-tackline :: Нет ложки. –

3

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

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

7

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

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

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

+0

+1 для подсказки при сканировании всех классов и автоматической инициализации. Было бы полезно использовать интерфейс/аннотацию маркера для классов, статический инициализатор которых должен быть автоматически выполнен (или любой другой заданный статический метод). Как сказано в связанной теме: Google Reflections может быть способом сделать это без особых хлопот. – Thomas

1

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

0

б.банку основной класс метод должен распространяться, что StaticClass затем автоматически, что статическое и блок инициализации() будет вызываться

0

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

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

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

как StaticClass staticClass = новый StaticClass();

или

StaticClass.class.newInstance();это более preferebal

+0

« Это более предпочтительно », почему? – EJP

1

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

Смежные вопросы