Java ClassLoader: загрузить один и тот же класс дважды - PullRequest
2 голосов
/ 21 марта 2012

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

   ClassLoader cl = Thread.currentThread().getContextClassLoader();
   Class<?> compiledClass = cl.loadClass(stringClass);

Чего мне не хватает?как новый экземпляр или что-то?

Ответы [ 3 ]

11 голосов
/ 21 марта 2012

Загрузчик классов не может заменить класс, который уже был загружен.loadClass вернет ссылку на существующий экземпляр Class.

Вам придется создать экземпляр нового загрузчика классов и использовать его для загрузки нового класса.И затем, если вы хотите «заменить» класс, вам придется выбросить этот загрузчик классов и создать еще один новый.


В ответ на ваши комментарии: сделайте что-то вроде

ClassLoader cl = new UrlClassLoader(new URL[]{pathToClassAsUrl});
Class<?> compiledClass = cl.loadClass(stringClass);

Этот загрузчик классов будет использовать «родительский класс по умолчанию для делегирования делегирования», и вы должны позаботиться о том, чтобы класс (определяемый как полное имя класса) не был загружен и не мог быть загружен этим родительским загрузчиком классов,Таким образом, pathToClassAsUrl не должен быть в пути к классам!

1 голос
/ 21 марта 2012

Вы должны каждый раз загружать новый ClassLoader или каждый раз присваивать классу другое имя и получать к нему доступ через интерфейс.

например,

interface MyWorker {
  public void work();
}

class Worker1 implement MyWorker {
  public void work() { /* code */ }
}

class Worker2 implement MyWorker {
  public void work() { /* different code */ }
}
0 голосов
/ 21 марта 2012

Я думаю, что проблема может быть более простой, чем то, что предлагают другие ответы.Вполне возможно, что загрузчик классов загружает файл, отличный от того, что вы думаете.Чтобы проверить эту теорию, удалите файл .class (НЕ перекомпилируйте исходный код .java) и запустите свой код.Вы должны получить исключение.

Если вы не получите исключение, то, очевидно, загрузчик классов загружает файл .class, отличный от того, который вы думаете.Поэтому найдите местоположение другого файла .class с тем же именем.Удалите этот файл .class и попробуйте снова.Продолжайте пробовать, пока не найдете файл .class, который на самом деле загружается.Как только вы это сделаете, вы можете перекомпилировать свой код и вручную поместить файл класса в правильный каталог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...