![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| x8m6 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Нужно выполнить принудительную инициализацию класса, но сделать это не в коде (исп. Class.forName()) а как-им либо декларативным путем, т.е. указать заранее (до начала выполнения программы) JVM что "вот именно этот класс нужно проинициализировать в первую очередь, еще до того как к нему произойдет какое-либо обращение". Может быть существует какая-то аннотация, пригодная для этого? Как вообще System CL загружает и инициализирует классы из cp?
Я так понимаю не сразу все, а используется принцип load on demand, т.е. в момент первого обращения к классу (создание экземпляра класса или вызов статик метода/поля)? |
|||
|
||||
| ki6opr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 20.12.2006 Репутация: нет Всего: нет |
почитать можно например тут
|
|||
|
||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
JVM использует 3 загрузчика: bootstrap, extension и system. В ходе исполнения когда встречается название класса работает сначала bootstrap загрузчик, который фактически ищет класс среди стандартных runtime библиотек, затем загрузчик extension который ищет класс в расширениях (lib/ext) и только в последнюю очередь вступает в действие системный загрузчик, который ищет класс в CLASSPATH. В вашем случае надо вставить в ваш код вызов какого-либо статического метода класса, тогда загрузчик загрузит класс до начала исполнения кода (IMHO мне так кажется - лично не проверял). Полезной будет трассировка порядка загрузки классов: ключ verbose:class при вызове JVM Это сообщение отредактировал(а) ivanovpv - 3.8.2010, 09:59 -------------------- Aut viam inveniam aut faciam |
|||
|
||||
| x8m6 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
ki6opr, в статье описываются способы инициализации во время выполнения программы. Повторяюсь, мне же нужно сделать это не в коде.
Спасибо, но это опять же вариант не совсем подходит. Думаю сделать так: создать аннотацию @prepareInitialization и свой лоадер. Лоадер должен будет пройтись по классам и найти аннотированные. Их он и загрузит первыми. Тогда вопрос в том как это сделать : "пройтись по классам и найти аннотированные"? Это сообщение отредактировал(а) x8m6 - 3.8.2010, 11:22 |
|||
|
||||
| aleksandy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 260 Регистрация: 17.12.2006 Репутация: 4 Всего: 5 |
x8m6, а нафига тебе такой геморрой? Чего ты хочешь этим добиться, подменить какой-то стандарный класс своим?
Это сообщение отредактировал(а) aleksandy - 3.8.2010, 12:59 |
|||
|
||||
| x8m6 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Нет, для инициализации списка фабрик. |
|||
|
||||
| ki6opr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 20.12.2006 Репутация: нет Всего: нет |
а не проще ли проводить инициализацию фабрики при первом обращении к ней ? |
|||
|
||||
| x8m6 |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Нет, обращение происходит только к абстрактной фабрике. А все остальные фабрики определяются в статических контекстах тех классов, для создания экземпляров которых они и применяются(т.е. в каждом подклассе своя фабрика). Создание же объектов занимается только абстрактная фабрика, у которой есть список фабрик для подклассов и фабричный метод. Чтоб было понятно вот пример:
Допустим есть класс машины: внутри него определяется своя фабрика как вложенный статический класс
Ну и теперь главный метод:
Закоментируйте Class.forName и увидите что список фабрик оказывается пустым, т.к. класс Car не был проинициализирован. Это сообщение отредактировал(а) x8m6 - 4.8.2010, 15:27 |
||||||||
|
|||||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Для подобных вещей в JDK 6 был добавлен Service Provider механизм. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| x8m6 |
|
||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
т.е. для данного примера я должен определить Factory как сервис, а CarFactory как ServiceProvider? Получилось. Спасибо вам LSD. Вот теперь как выглядит класс фабрики:
вот фабрика для машин:
Так же получилось сделать через аннотацию, но это более геморройный вариант:
Помечаем класс фабрики машин этой аннотацией:
Далее пишем своего инициализатора:
Это сообщение отредактировал(а) x8m6 - 4.8.2010, 23:21 |
||||||||||||
|
|||||||||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |