Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > ClassLoader


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

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!!!!
В чём у меня ошибка???

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)