Загрузчик классов в апплете: не удается получить доступ к файлам - PullRequest
1 голос
/ 20 сентября 2011

У меня есть приложение, которое использует отражение для создания экземпляра кода, сохраненного в некотором каталоге: я создаю URLClassLoader, который затем загружает классы, используя предоставленные URL-адреса;это отлично работаетЯ пытался портировать приложение на апплет.Для загрузки текстовых файлов и изображений я изменил код с использования относительных путей на getResourceAsStream(), который прекрасно работает.Однако для загрузчика классов у меня все еще есть исключение ввода-вывода (которое я также использовал для получения текстовых файлов и изображений до того, как изменил код для использования потоков):

java.security.AccessControlException: access denied (java.io.FilePermission /.../... read)

Классы вбыть загружены содержатся в файле JAR (как и все другие ресурсы).Есть ли способ загрузить классы, используя что-то вроде getResourceAsStream(), которое не вызывает исключения безопасности?Обратите внимание: я говорю о загрузчике классов, вызываемом из кода Java, а не загрузчике классов, который загружает апплет.

РЕДАКТИРОВАТЬ: Подробнее о структуре файла / папки:

MyАпплет находится в пакете a, a.MyApplet, который использует класс a.aa.Loader, который предназначен для загрузки классов, хранящихся в другой папке b (следовательно, не загружается при загрузке апплета).Папка b содержит много каталогов, b.c_i, где c_i - уникальный каталог.В каждом из этих каталогов есть классы, которые принадлежат пакету xyz, поэтому общая структура папок b: b.c_i.xyz;z содержит файл для загрузки.Когда я создаю банку, верхний уровень выглядит следующим образом ([] обозначает папку): [a], [b], [data], [images] где [a] = {MyApplet, [aa], [aaa]и т. д.} и [b] = {c_1, _c2, ...} где c_i = {[x]}, [x] = {[y]}, [y] = {[z]} и, наконец, [z] = {Class.class}.Надеюсь, что обозначение не слишком странное.

Edit2: Подробнее.

Чтобы уточнить: классы, которые я хочу загрузить, являются классами других людей, все они помещены в отдельный каталог "DIR" (они не являются частью проекта и не формируют проект сами).Фактически, все эти имена классов идентичны, они хранятся в уникальных каталогах в «DIR».Мне нужно загрузить один файл за раз.Другими словами, я хотел бы относиться к файлам классов как к любому другому ресурсу.

ПРИМЕЧАНИЕ. Я пробовал подписанный апплет, и он больше не выдает исключение безопасности, а IO: он не может найти файл.Я проверил структуру каталогов и перепробовал множество вариантов, все с одинаковым результатом (он работает на моей локальной машине).Я не уверен, действительно ли это проблема ввода-вывода или проблема безопасности.

1 Ответ

1 голос
/ 21 сентября 2011

На самом деле, сохранение проекта в виде отдельного диапазона объектов - это плохой тон, поэтому ...

  • Вы можете просто упаковать весь свой проект в один файл JAR.

  • В случае, если вы держите свои классы на сервере только потому, что весь проект слишком велик, вы можете сжать его с помощью утилиты pack200, которая очень полезна для апплетов толстого клиента Java Web Start

  • И я действительно рекомендую использовать тип запуска апплета jnlp, поскольку он предоставляет больше опций с DeployJava.js

PS

Иесли вы действительно настаиваете на том, чтобы загружать ресурсы с помощью загрузчика классов, делайте это стандартным способом апплета, я имею в виду объект Anchor

, например, создайте структуру, такую ​​как

  • | - образы пакетов -
  • | imageA.png
  • | imageB.png
  • | Anchor.class
  • | SourceBound.class

SourceBound.java

public class SourceBound
{

  /**
    Conception only...
  **/
  public SourceBound(){}

  public ImageIcon getImageA()
  {
    ImageIcon icon;
    Image image;

    image=ImageIO.read(Anchor.class.getResourceAsStream("imageA.png"));
    icon=new ImageIcon(image);

    return icon;
  }
}

  • | пакетный тест
  • | Test.class

Test.java

public class Test
{

SourceBound sourceBound=new SourceBound();

Test()
{
  JButton button=new JButton();
  button.setIcon(sourceBound.getImageA());

}

}

Удачи

...