2012-02-10 6 views
1

Добрый день все,Как мы загружаем классы при запуске JVM (сразу)?

Мне было интересно, так или иначе, чтобы статический блок класса выполнялся, даже если сам класс не ссылается?

Я знаю, что, что он лениво загружен таким образом, чтобы просто вызвать любого из функций этого класса начнет инициировать класс,

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

Preloading java classes/libraries at jar startup предложил обходной путь, но его на самом деле не решение я ищу (в основном я не хочу, чтобы нужно сделать Class.forName, я хочу, чтобы это было сделано на JVM старт)

Как бы мы продолжаем это делать?

+1

Хотите знать, что вы делаете? Вы можете загружать все, что вам нужно, в public static void main method, так как это начальная точка любого приложения. У вас нет доступа к этому коду, используйте сервлет загрузки-на-запуск (прослушиватель, фильтр) в случае веб-приложения. Или другой подход, если это не веб-приложение. – Anton

+0

@Umar У меня есть библиотека, которая выполняет некоторые * записи в журнал *. В основном, я хочу, чтобы он делал некоторые вещи при запуске (пока ссылается на библиотеку), но без использования 'MyLibrary.Init.Init()' в начале основного метода. – Pacerier

+2

Это немного круговой. Вы хотите загружать классы при запуске без загрузки классов при запуске определенным образом. Кажется, вы хотите что-то более автоматическое. Стоит отметить, что агрессивная загрузка классов не вызывает методы в этих классах для компиляции. Я бы использовал методы, которые являются критическими, и это приведет к загрузке классов. –

ответ

2

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

Используя класс-оболочку вокруг существующего приложения может быть чище альтернативой, если все, что вам нужно для некоторого класса должны быть инициализированы до вашего фактического кода приложения выполняется:

public class LoggedLauncher { 
    public static void main(String[] args) { 
     // Do whatever you need to initialize your logging class 
     // 
     // e.g. call a static method: 
     // 
     // MyLogger.init(); 

     // ...then start your application 
     MyApplication.main(args); 
    } 
} 

Вы можете даже использовать немного отражения, чтобы класс приложения мог быть предоставлен в качестве аргумента для оболочки, заменив жестко заданную ссылку. Если вы это сделаете, не забудьте манипулировать массивом args, чтобы соответствующие аргументы передавались методу main() вашего приложения.

+0

Да, знаете ли вы, какие опции JVM позволяют нам это делать? – Pacerier

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