|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
Есть класс: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
Задача: вызвать метод registerClass( MyClass.class ) в момент загрузки, до вызова main(). Особое условие: код, вызывающий метод, должен находиться в контексте самого класса MyClass, никакой другой класс не может ничего "знать" про данный. То есть класс должен уметь зарегистрировать сам себя. Казалось бы, для этой цели подошел бы статический блок инициации, как и показано в примере выше, но увы, код этого блока вызывается не в момент загрузки, а лишь в момент первого обращения к какому-либо полю или методу класса. То есть кто-то "снаружи" должен явно обратиться классу. Не подходит. В Delphi, например, каждый модуль может содержать секцию initialization как раз для решения подобных задач. Я в Java недавно, как тут это решается? Поскольку работаю со Spring, попробовал добавить классу аннотацию @Component, что вроде бы должно было заставить систему создать на старте один экземпляр MyClass, и в результате статический блок должен был сработать. Не помогло. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 20:23 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
shalamyansky, Бро, а какова твоя цель вообще? Ты явно пошел не по той дорожке. То о чем ты спрашиваешь может и возможно но это тобой же придуманный костыль. Какую проблему решаешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 22:08 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
shalamyansky, какой такой метод main() ? Дружище есть шаблоны такие как Singleton. Или Spring Bean в реализации Singleton. Они - работают. Используй их. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 23:20 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
Цель - зарегистрировать класс :) Планируемая архитектура такая: есть базовый класс, который ничего не знает о своих наследниках. Но каждому наследнику дает возможность внести себя в поддерживаемый список методом registerClass. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Таким образом, если решена задача топика, после загрузки список registeredClasses содержит всех наследников, которые пожелали в нем оказаться. (По данному коду это могут быть не только наследники, но не суть, для простоты будем говорить о наследниках). Зачем это надо? Дело в том, что есть рабочий класс - потребитель интерфейса TargetInterface, который может принять реализующие его классы и с их помощью производить нужную работу: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
В результате все, кто хотел, включили себя в работу класса Consumer, но явные зависимости на этапе компиляции нигде не прописаны. Это удобно, особенно когда наследуешь не свои классы. Просто создал наследника, в нем обеспечил вызов registerClass() - и все работает. Иначе приходится писать что-то такое ужасное: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Короче, классическая задача регистрации классов :) Удивлен, что она оказалось непростой в реализации. Даже пока еще и нереализованной. Если совсем конкретно - пишу набор функций расширений для XSLT-процессора SAXON. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 23:40 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
mayton Или Spring Bean в реализации Singleton. Вот я и попробовал добавить @Component к MyClass, но что-то он не создался. Возможно, надо правильно установить @ComponentScan, но для этого надо еще понять, где же именно его установить. Вот, разбираюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 23:47 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
Сорри, в сообщении от 23:40 вместо BaseExtensionFunction читать BaseClass. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 23:56 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
shalamyansky, Вопрос: Почему не используете готовые фреймворки, по типу Spring? Создание своего инфраструктурного кода сегодня очень дорогое удовольствие. А так... Пишите свой класслоадер, а там можете инициализировать всё что хотите и как хотите. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 06:17 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
shalamyansky Цель - зарегистрировать класс :) Планируемая архитектура такая: есть базовый класс, который ничего не знает о своих наследниках. Но каждому наследнику дает возможность внести себя в поддерживаемый список методом registerClass. JVM устроена по другому и не надо лезть с собственным уставом в чужой монастырь. Если загрузка начинается с класса-потомка, то сначала конструируется класс-предок. Следовательно, ваш registerClass() должен быть в конструкторе. Но есть засада: загрузка - действие разовое. Поэтому - не выёживайтесь: дёргайте в конструкторе класса-потомка защищённый финальный (может и статический) метод класса-предка. P.S. Вообще, конечно, логика - пипец. Никто ничего не знает, но есть классы-потомки. Вы что - в детский дом их сдаёте и наследства лишаете??? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 07:05 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
если я правильно перевел смысл идеи, ТС - хочет получить в рантайме список ВСЕХ классов, реализующих определенный интерфейс (там еще есть "который желает", но это имхо глупость - тот кто "не желает", просто не должен реализовывать интерфейс). Если у нас спринг, то такое должно работать Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 15:30 |
|
В контексте класса вызвать код времени загрузки
|
|||
---|---|---|---|
#18+
shalamyansky Короче, классическая задача регистрации классов :) Удивлен, что она оказалось непростой в реализации. Даже пока еще и нереализованной. Классической задаче - классическое решение! Задача "предоставить интерфейс, к которому позже подключаются разные реализации" решается с помощью ServiceLoader . Если хочется менее формальной прозы - учебник . Если хочется красивого интерфейса - напишите обвязку вокруг этого стандартного механизма. Да, нужно все делать аккуратно (правильно манифест писать к библиотеке и т.п.). Но проблему-то решает. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 21:19 |
|
|
start [/forum/topic.php?fid=59&msg=40019977&tid=2120609]: |
0ms |
get settings: |
8ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
34ms |
get topic data: |
2ms |
get forum data: |
1ms |
get page messages: |
168ms |
get tp. blocked users: |
0ms |
others: | 295ms |
total: | 515ms |
0 / 0 |