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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ClassLoader, заменить системный своим 
:(
    Опции темы
Rusico
Дата 19.2.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 17.5.2004

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



Всем привет!) есть вопрос, каким образом мне заменить системный загрузчик своим? у меня есть свой загрузчик и с помощью его я запускаю программу, вот пример: 
Код

public class Loader {
  public static void main(String[] args) {
    DinamicClassLoader classLoader = new DinamicClassLoader();
    classLoader.addClassPath("C:/Documents and Settings/Antosha/Мои документы/NetBeansProjects/test/build/classes");
    try {
      Class module = Class.forName("test.TestModule", true, classLoader);
      Method main = module.getMethod("main", new Class[] {String[].class});
      main.invoke(module, new Object[]{args});
    }catch(Exception ex) {
      ex.printStackTrace();
    }
  }
}


А вот сам загрузчик:
Код

public class DinamicClassLoader extends ClassLoader {
  private Map<String,Class>  classCash = new HashMap<String,Class>();
  private List<String>       classPath = new ArrayList<String>();

  public DinamicClassLoader() {
  }

  @Override
  protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    Class result= findClass(name);
    if(resolve)
      resolveClass(result);
    return result;
  }

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException {
    Class result= (Class)classCash.get(name);
    if(result!=null)
      return result;
    File f= findFile(name.replace(".",File.separator),".class");
    if(f == null)
      return findSystemClass(name);
    try {
      byte[] classBytes = loadFileAsBytes(f);
      result = defineClass(name, classBytes, 0, classBytes.length);
    }catch(IOException e) {
      throw new ClassNotFoundException("Cannot load class "+name+": "+e);
    }catch(ClassFormatError e) {
      throw new ClassNotFoundException("Format of class file incorrect for class "+name+": "+e);
    }
    classCash.put(name,result);
    return result;
  }

  @Override
  protected URL findResource(String name) {
    File f= findFile(name, "");
    if(f==null)
      return null;
    try {
      return f.toURL();
    }catch(MalformedURLException ex) {
      return null;
    }
  }

  private File findFile(String name, String extension) {
    for(int i=0;i<classPath.size();i++) {
      File f= new File((new File(classPath.get(i))).getPath()+File.separator+name.replace("/",File.separator)+extension);
      if(f.exists())
        return f;
    }
    return null;
  }

  public static byte[] loadFileAsBytes(File file) throws IOException {
    byte[] result= new byte[(int)file.length()];
    FileInputStream f= new FileInputStream(file);
    try {
      f.read(result,0,result.length);
    }finally {
      try {
        f.close();
      }catch(Exception e) {}
    }
    return result;
  }

  
  public void addClassPath(String path) {
    classPath.add(path);
  }

  public void removeClassPath(String path) {
   if(classPath.contains(path))
     classPath.remove(path);
  }
}


это класс программы:
Код

public class TestModule {
  public static void main(String[] args) {
    System.out.println(ClassLoader.getSystemClassLoader().getClass().getName());
  }
}


Так вот возвращает всё равно sun.misc.Launcher$AppClassLoader!!!!
В чём у меня ошибка???

PM MAIL   Вверх
jk1
Дата 19.2.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Полностью заменить системный загрузчик своим вы не сможете, потому что
Цитата

The Java platform uses a delegation model for loading classes. The basic idea is that every class loader has a "parent" class loader. When loading a class, a class loader first "delegates" the search for the class to its parent class loader before attempting to find the class itself. 
Constructors in java.lang.ClassLoader and its subclasses allow you to specify a parent when you instantiate a new class loader. If you don't explicitly specify a parent, the virtual machine's system class loader will be assigned as the default parent. 

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

http://java.sun.com/docs/books/tutorial/ext/basics/load.html
http://onjava.com/pub/a/onjava/2005/01/26/classloading.html


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

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

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


 




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


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

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