Как я могу определить, в каком контексте Java-апплета работает без передачи идентификатора?

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

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

10.08.2008 18:06:04
3 ОТВЕТА
РЕШЕНИЕ

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

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

Другие хаки:

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

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

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

3
6.09.2008 21:12:21
Это (безусловно) лучшая коллекция идей, которые я видел по этому вопросу. Мне особенно нравится "выдвинуть настроенную очередь событий" - и я собираюсь попробовать это.
Ran Biron 17.09.2008 04:56:28

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

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

0
11.08.2008 12:32:02

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

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

  1. Общий поток (соединения с сервером и т. Д.) Проблематичен. Это можно решить, уделив особое внимание этим потокам (все они находятся под моим контролем и в значительной степени изолированы от устаревшего кода).
  2. Поток EDT является общим для всех апплетов. Мне не удалось найти способ форсировать создание нового потока EDT для каждого апплета. Это означает, что локальный поток для EDT будет общим для всех апплетов. Этот я понятия не имею, как решить. Предложения?
0
11.08.2008 20:06:28
Вы должны иметь возможность получить новый поток EDT, используя другое значение для тега архива. Я думаю, что вы можете просто добавить случайное имя банки до конца, даже если оно существует.
Tom Hawtin - tackline 11.10.2008 01:10:16