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

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

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

Ответы [ 3 ]

2 голосов
/ 06 сентября 2008

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

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

Другие хаки:

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

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

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

0 голосов
/ 12 августа 2008

@ Гюго относительно локальных потоков:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...