Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разрешить использовать только определенные пакеты, классу загруженому моим ClassLoader'ом 
V
    Опции темы
Maksym
  Дата 28.4.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



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

Хочу чтобы или ClassLoader или код, который дергает методы, контролировали не пытается ли загруженный класс использовать функциональнось запрещенных пакетов (например, я хочу запретить свежезагруженным классам юзать java.util.*).

Желательно выяснить это на этапе загрузки, но можно и on demand. При попытке использовать несанкционированный пакет, класс, метод -- выбросить исключение. Такое поведение должно быть реализовано не только для самого класса, но и для всех используемых им. 

Короче, надо построить песочницу и реализовать то, что делает загрузчик для аплетов при попытке апплета записать файл в корень диска C smile

Вопрос срочный, совершенно нет времени конкретно вникать в тему, поэтому прошу у комьюнити ургентной помощи  smile  smile
 smile 
PM MAIL   Вверх
LSD
Дата 28.4.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Попробуй так: создаешь свой класс лоадер
Код

public class MyClassLoader extends ClassLoader
{
  private Set<String> forbidenPackages;

  public MyClassLoader(ClassLoader parent, Set<String> forbidenPackages)
  {
    super(parent);
    this.forbidenPackages = forbidenPackages;
  }

  public MyClassLoader(Set<String> forbidenPackages)
  {
    this.forbidenPackages = forbidenPackages;
  }

  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException
  {
    validate(name);
    try
    {
      return super.loadClass(name);
    }
    catch(ClassNotFoundException e)
    {
      //try to load class your self
    }
  }

  @Override
  protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
  {
    ...
  }

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException
  {
    ...
  }

  private void validate(String name) throws ClassNotFoundException
  {
    String p = name.substring(0, name.lastIndexOf('.'));
    if(forbidenPackages.contains(p))
      throw new ClassNotFoundException("Class " + name + " not found");
  }
}

определяешь его как context ClassLoader и грузишь им нужные классы. По идее ресолвить классы они будут через него.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Maksym
Дата 28.4.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



LSD
Супер! Сделал и заработало.

Но я закомментировал 
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
protected Class<?> findClass(String name) throws ClassNotFoundException
,
а реализовал только место
//try to load class your self.

Думаю, ты предложил мне реализовать эти два метода не просто так... В чем фишка, зачем нужно переопределять их?
PM MAIL   Вверх
LSD
Дата 28.4.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата
Loads the class with the specified binary name. The default implementation of this method searches for classes in the following order: 
1. Invoke findLoadedClass(String) to check if the class has already been loaded. 
2. Invoke the loadClass method on the parent class loader. If the parent is null the class loader built-in to the virtual machine is used, instead. 
3. Invoke the findClass(String) method to find the class.


Т.е. findClass(String) должен делать основную работу по загрузке классов. А в loadClass(String) надо его только вызывать.
Насчет метода loadClass(String, boolean) умолчальная реализация ClassLoader-а именно его и вызывает. Так что можно было переопределить, только этот метод.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Maksym
Дата 29.4.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Спасибо, LSD, выручил не в первый раз. Вопрос решен  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.