Как я могу определить, в каких Java Applet контекст работает без прохождения ID?

голоса
6

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

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

Задан 10/08/2008 в 19:06
источник пользователем
На других языках...                            


3 ответов

голоса
2

Одиночки злы, что вы ожидаете? ;)

Пожалуй, наиболее комплексный подход будет загружать основную часть апплета в другой загрузчик классов (используйте java.net.URLClassLoader.newInstance). Затем используйте WeakHashMap связать загрузчик классов с апплетом. Если бы вы могли разделить большую часть кода в общий загрузчик классов (как родитель каждого каждого апплета загрузчика классов) и в обычный апплет кодовую, что будет быстрее, но больше работы.

Другие писаки:

Если у вас есть доступ к любому компоненту, вы можете использовать Component.getParent повторно или SwingUtilities.getRoot.

Если вы находитесь в за апплета экземпляра потока, то вы можете настроить ThreadLocal.

Из EDT, вы можете прочитать текущее событие из очереди (java.awt.EventQueue.getCurrentEvent ()), и, возможно, найти компонент из этого. В качестве альтернативы вытолкнуть EventQueue с переопределенным методом dispatchEvent.

Ответил 05/09/2008 d 22:13
источник пользователем

голоса
0

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

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

  1. Общий поток (соединения сервера, и т.д.) являются проблематичными. Эту проблему можно решить, хотя, обращая особое внимание на эти нити (они все под моим контролем и в значительной степени изолированы от унаследованного кода).
  2. EDT поток разделяется на всех апплетов. Я не смог найти способ заставить создание новой EDT нити для каждого апплета. Это означает, что ThreadLocal для EDT будет распределяться через апплеты. Это один я понятия не имею, как решить. Предложения?
Ответил 11/08/2008 d 21:06
источник пользователем

голоса
0

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

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

Ответил 11/08/2008 d 13:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more