2008-09-13 3 views
5

Если я использую подписанный Java-апплет, могу ли я загрузить дополнительные классы из удаленных источников (в том же домене, может быть, и на том же хосте) и запустить их?Загрузка классов Java из подписанного апплета

Я бы хотел сделать это, не меняя страницы или даже останавливая текущий апплет. Конечно, общий размер всех классов слишком велик, чтобы загрузить их все сразу.

Есть ли способ сделать это? И есть ли способ сделать это с помощью подписанных апплетов и сохранить их статус «доверия»?

ответ

5

Я думаю, что классы ленивы загружаются в апплеты. загружается по требованию.

В любом случае, если классы находятся за пределами банки, вы можете просто использовать загрузчик классов апплета и загрузить их по имени. Пример:

ClassLoader loader = this.getClass().getClassLoader(); 
Class clazz = loader.loadClass("acme.AppletAddon"); 

Если вы хотите загружать классы из баночки, я думаю, вам нужно будет создать новый экземпляр URLClassLoader с URL (ы) банки (ов).

URL[] urls = new URL[]{new URL("http://localhost:8080/addon.jar")}; 
URLClassLoader loader = URLClassLoader.newInstance(urls,this.getClass().getClassLoader()); 
Class clazz = loader.loadClass("acme.AppletAddon"); 

По умолчанию апплетам запрещено создавать новые загрузчики классов. Но если вы подпишете свой апплет и включите разрешение на создание новых загрузчиков классов, вы можете это сделать.

+0

Спасибо, URLClassLoader кажется именно тем, что я хотел. Мне просто нужно убедиться, что я могу сохранить цепочку подписи целыми. – 2008-09-13 17:14:48

+1

Он работал после того, как был подписан подписчик (загрузчик). Но дочерние (загруженные) баночки, даже если они подписаны, не получают разрешения безопасности. – 2008-09-14 11:28:32

0

Кажется, что это должно быть возможно (но я этого никогда не делал). Вы уже просмотрели метод удаленного вызова метода (RMI)?

+0

RMI не является тем направлением, которое я ищу, но в любом случае спасибо. – 2008-09-13 17:15:19

2

Да, вы можете открыть URL-соединения с хостом, из которого вы запускали ваш апплет. Вы можете либо создать загрузчик классов с URL-адресами HTTP, либо загрузить классы (как банки) на машину пользователя и создать загрузчик классов с этими банками в пути к классам. Апплет не остановится, и вам не нужно загружать другую страницу.

Что касается второй части вашего вопроса о доверии, как только пользователь предоставил вам доступ к вашему апплетам, он может загрузить что угодно, да что угодно, он хочет локальную машину. Вероятно, вы можете сообщить пользователю о том, что он делает, если это позволяет ваш дизайн пользовательского интерфейса.

Надеюсь, это поможет.

Смежные вопросы