gui - java swing show



Как определить, в каком контексте Java Applet работает без передачи идентификатора? (2)

Я часть команды, которая разрабатывает довольно большой Java-апплет Swing. Большая часть нашего кода является наследием, и есть тонны ссылок на одноэлементные. Мы сгруппировали все их в один сингл «Контекст приложения». Теперь нам нужно создать способ разделения общего контекста (общий для всех отображаемых апплетов) и не общего контекста (специфического для каждого аплета, отображаемого в настоящее время).

Однако у нас нет идентификатора в каждом из мест, которые звонят в singleton, и мы не хотим распространять ID во всех местах. Какой самый простой способ определить, в каком контексте апплета мы запускаем? (Я пытался возиться с загрузчиками классов, группами потоков, идентификаторами потоков ... до сих пор я не мог найти ничего, что позволило бы мне идентифицировать происхождение вызова).

https://ffff65535.com


Если я правильно вас понимаю, идея состоит в том, чтобы получить другой «одиночный» объект для каждого объекта-вызывающего или «контекста». Одна вещь, которую вы можете сделать, - создать глобальную переменную потока, где вы пишете идентификатор текущего контекста. (Это можно сделать с помощью AOP.) Затем в однопользовательском getter идентификатор контекста извлекается из локального потока, чтобы использовать его в качестве ключа к правильному экземпляру «singleton» для вызывающего контекста.

Что касается АОП, то в апплетах не должно быть никаких проблем, поскольку, в зависимости от ваших точек, советы сотканы во время компиляции, а JAR добавляется к зависимостям времени выполнения. Следовательно, никакое специальное доказательство АОП не должно оставаться во время выполнения.


@Hugo относительно threadlocal:

Я думал об этом решении. Однако из экспериментов я нашел две проблемы с этим подходом:

  1. Общая тема (серверные соединения и т. Д.) Проблематична. Это можно решить, обратив особое внимание на эту нить (они все под моим контролем и в значительной степени изолированы от устаревшего кода).
  2. Поток EDT используется для всех апплетов. Мне не удалось найти способ создать новый поток EDT для каждого апплета. Это означает, что threadlocal для EDT будет передаваться через апплеты. Это я не знаю, как решить. Предложения?




applet