У меня есть приложение, которое использует отражение для создания экземпляра кода, сохраненного в некотором каталоге: я создаю URLClassLoader, который затем загружает классы, используя предоставленные URL-адреса; это работает нормально. Я попытался перенести приложение на апплет. Для загрузки текстовых файлов и изображений я изменил код с использования относительных путей на использование getResourceAsStream()
, который отлично работает. Однако для загрузчика классов у меня все еще есть исключение ввода-вывода (которое я также использовал для получения текстовых файлов и изображений, прежде чем я изменил код для использования потоков):
java.security.AccessControlException: access denied (java.io.FilePermission /.../... read)
Загружаемые классы содержатся в файле jar (как и все остальные ресурсы). Есть ли способ загрузить классы, используя что-то вроде getResourceAsStream()
, которое не вызывает исключение безопасности? Обратите внимание: я говорю о загрузчике классов, вызываемом из java-кода, а не о загрузчике классов, который загружает апплет.
РЕДАКТИРОВАТЬ: Подробнее о структуре файлов/папок:
Мой апплет находится в пакете a, a.MyApplet, который использует класс a.aa.Loader, предназначенный для загрузки классов, хранящихся в другой папке b (поэтому не загружается при загрузке апплета). Папка b содержит множество каталогов, b.c_i, где c_i — уникальный каталог. В каждом из этих каталогов находятся классы, принадлежащие пакету x.y.z, поэтому общая структура папок b имеет вид b.c_i.x.y.z; z содержит файл для загрузки. Когда я создаю банку, верхний уровень выглядит следующим образом ([] указывает папку): [a], [b], [data], [images], где [a] = {MyApplet, [aa], [aaa] и т. д.} и [b]={c_1,_c2,...}, где c_i={[x]}, [x]={[y]}, [y]={[z]} и, наконец, [z ]={Класс.класс}. Надеюсь, обозначение не слишком странное.
Редактировать 2: Подробнее.
Чтобы уточнить: классы, которые я хочу загрузить, - это классы других людей, все они помещены в отдельный каталог «DIR» (они не являются частью проекта и сами не образуют проект). На самом деле все эти имена классов идентичны, они хранятся в уникальных каталогах внутри "DIR". Мне нужно загрузить один файл за раз. Другими словами, я хотел бы обращаться с файлами классов, как с любым другим ресурсом.
ПРИМЕЧАНИЕ. Я попробовал подписанный апплет, и он больше не выдает исключение безопасности, а исключение ввода-вывода: он не может найти файл. Я проверил структуру каталогов и попробовал множество вариантов, все с тем же результатом (это работает на моей локальной машине). Я не уверен, действительно ли это проблема ввода-вывода или все еще проблема безопасности.
SecurityManager
(поскольку это не то действие, которое вы хотите сделать бесплатным для какого-то случайного апплета). - person Alex Abdugafarov   schedule 20.09.2011Class.forName()
. я понимаю, что вы не хотите давать фактические данные о классе, но вам нужно быть более конкретным, если вам нужна помощь. используйте поддельные каталоги/пакеты, если хотите, но подробно опишите, где что находится и что именно вы пытаетесь сделать. - person jtahlborn   schedule 20.09.2011