Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / В контексте класса вызвать код времени загрузки / 10 сообщений из 10, страница 1 из 1
17.11.2020, 20:23
    #40019669
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
Есть класс:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class MyClass extends BaseClass{
    
    static public boolean test = false;

    static {
        registerClass( MyClass.class );
    }
    
}



Задача: вызвать метод registerClass( MyClass.class ) в момент загрузки, до вызова main().

Особое условие: код, вызывающий метод, должен находиться в контексте самого класса MyClass, никакой другой класс не может ничего "знать" про данный. То есть класс должен уметь зарегистрировать сам себя.

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

В Delphi, например, каждый модуль может содержать секцию initialization как раз для решения подобных задач.

Я в Java недавно, как тут это решается?

Поскольку работаю со Spring, попробовал добавить классу аннотацию @Component, что вроде бы должно было заставить систему создать на старте один экземпляр MyClass, и в результате статический блок должен был сработать. Не помогло.
...
Рейтинг: 0 / 0
17.11.2020, 22:08
    #40019705
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
shalamyansky,

Бро, а какова твоя цель вообще? Ты явно пошел не по той дорожке. То о чем ты спрашиваешь может и возможно но это тобой же придуманный костыль. Какую проблему решаешь?
...
Рейтинг: 0 / 0
17.11.2020, 23:20
    #40019725
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
shalamyansky, какой такой метод main() ?

Дружище есть шаблоны такие как Singleton. Или Spring Bean в реализации Singleton.
Они - работают. Используй их.
...
Рейтинг: 0 / 0
17.11.2020, 23:40
    #40019730
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
Цель - зарегистрировать класс :) Планируемая архитектура такая: есть базовый класс, который ничего не знает о своих наследниках. Но каждому наследнику дает возможность внести себя в поддерживаемый список методом registerClass.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class BaseClass implements TargetInterface {

    @Override
    //TargetInterface implementation
    
    static private final List<Class> registeredClasses = new ArrayList<Class>(){};
    
    static protected boolean registerClass( Class cls ){ ... }

    static public Iterator<Class> getIterator(){ return registeredClasses.iterator(); }
    
}


Таким образом, если решена задача топика, после загрузки список registeredClasses содержит всех наследников, которые пожелали в нем оказаться. (По данному коду это могут быть не только наследники, но не суть, для простоты будем говорить о наследниках).

Зачем это надо? Дело в том, что есть рабочий класс - потребитель интерфейса TargetInterface, который может принять реализующие его классы и с их помощью производить нужную работу:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import test.BaseClass;

public class Consumer{

    //cls must implemets TargetInterface
    public void applyClass( BaseClass cls  ){ ... }

    public void applyClasses(){
        Iterator<Class> iterator = BaseExtensionFunction.getIterator();
        while( iterator.hasNext() ){
            applyClass( iterator.next() );
        }
    }

    public void DoTargetWork(){}

}



В результате все, кто хотел, включили себя в работу класса Consumer, но явные зависимости на этапе компиляции нигде не прописаны. Это удобно, особенно когда наследуешь не свои классы. Просто создал наследника, в нем обеспечил вызов registerClass() - и все работает. Иначе приходится писать что-то такое ужасное:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
import test.BaseClass;
import test.MyClass1;
import test.MyClass2;
import test.MyClass3;
//...

public class Consumer{

    //cls must implemets TargetInterface
    public void applyClass( BaseClass cls  ){ ... }

    public void applyClasses(){
        applyClass( MyClass1.class );
        applyClass( MyClass2.class );
        applyClass( MyClass3.class );
        //...
    }

    public void DoTargetWork(){}

}



Короче, классическая задача регистрации классов :) Удивлен, что она оказалось непростой в реализации. Даже пока еще и нереализованной.

Если совсем конкретно - пишу набор функций расширений для XSLT-процессора SAXON.
...
Рейтинг: 0 / 0
17.11.2020, 23:47
    #40019734
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
mayton

Или Spring Bean в реализации Singleton.

Вот я и попробовал добавить @Component к MyClass, но что-то он не создался. Возможно, надо правильно установить @ComponentScan, но для этого надо еще понять, где же именно его установить. Вот, разбираюсь.
...
Рейтинг: 0 / 0
17.11.2020, 23:56
    #40019736
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
Сорри, в сообщении от 23:40 вместо BaseExtensionFunction читать BaseClass.
...
Рейтинг: 0 / 0
18.11.2020, 06:17
    #40019786
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
shalamyansky,

Вопрос:
Почему не используете готовые фреймворки, по типу Spring?
Создание своего инфраструктурного кода сегодня очень дорогое удовольствие.

А так... Пишите свой класслоадер, а там можете инициализировать всё что хотите и как хотите. :-)
...
Рейтинг: 0 / 0
18.11.2020, 07:05
    #40019790
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
shalamyansky
Цель - зарегистрировать класс :) Планируемая архитектура такая: есть базовый класс, который ничего не знает о своих наследниках. Но каждому наследнику дает возможность внести себя в поддерживаемый список методом registerClass.
Хреново вы Дельфи знаете :) У dll есть точка входа для событий подключения-отключения процессов и потоков в процессах. Именно это и позволяет "делать всякое".

JVM устроена по другому и не надо лезть с собственным уставом в чужой монастырь.
Если загрузка начинается с класса-потомка, то сначала конструируется класс-предок. Следовательно, ваш registerClass() должен быть в конструкторе.
Но есть засада: загрузка - действие разовое. Поэтому - не выёживайтесь: дёргайте в конструкторе класса-потомка защищённый финальный (может и статический) метод класса-предка.

P.S.
Вообще, конечно, логика - пипец.
Никто ничего не знает, но есть классы-потомки. Вы что - в детский дом их сдаёте и наследства лишаете???
...
Рейтинг: 0 / 0
18.11.2020, 15:30
    #40019977
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
если я правильно перевел смысл идеи, ТС - хочет получить в рантайме список ВСЕХ классов, реализующих определенный интерфейс (там еще есть "который желает", но это имхо глупость - тот кто "не желает", просто не должен реализовывать интерфейс). Если у нас спринг, то такое должно работать

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public interface MyInterface {
}

@Component
public class MyInteface1Impl implements MyInterface{
}

@Component
public class MyInteface2Impl implements MyInterface{
}

class MyComponent {

  private final List<MyInterface> workers;

  @Autowired
  public MyComponent(List<MyInterface> workers) {
    this.workers = workers;
  }
}
...
Рейтинг: 0 / 0
18.11.2020, 21:19
    #40020133
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В контексте класса вызвать код времени загрузки
shalamyansky

Короче, классическая задача регистрации классов :) Удивлен, что она оказалось непростой в реализации. Даже пока еще и нереализованной.


Классической задаче - классическое решение! Задача "предоставить интерфейс, к которому позже подключаются разные реализации" решается с помощью ServiceLoader . Если хочется менее формальной прозы - учебник .

Если хочется красивого интерфейса - напишите обвязку вокруг этого стандартного механизма. Да, нужно все делать аккуратно (правильно манифест писать к библиотеке и т.п.). Но проблему-то решает.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / В контексте класса вызвать код времени загрузки / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]