2011-12-14 4 views
1

Может ли загрузчик классов java загружать класс более одного раза, то есть загружать новые версии класса, не бросая LinkageError из «определения дублирующего класса»?Может ли загрузчик классов java загружать класс более одного раза

Другими словами, если нам нужно динамически перезагружать класс, это можно сделать с помощью того же загрузчика классов или сначала нужно уничтожить загрузчик классов, а создать новый, который будет загружать новую версию класса ?

+0

Возможно, вам понадобится [OSGI] (http://en.wikipedia.org/wiki/OSGi) – stivlo

+1

принятый ответ на этот вопрос весьма полезен: http://stackoverflow.com/questions/148681/unloading-classes -in-java – laher

ответ

3

Классный загрузчик может загружать только один класс один раз! Это означает, что он может определить его только один раз. Он может загружать его много раз, но только в первый раз, когда он определит его. В остальное время он будет загружать существующий экземпляр, который он уже определил с первого раза.

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

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

Конечно, это вызывает дополнительную нагрузку, но если вам это нужно, это нормально.

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

+0

Также см. Здесь на ту же тему: http://zeroturnaround.com/blog/reloading-objects-classes-classloaders/ (в значительной степени объясняет выше). –

0

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

+1

В вопросе спрашивается, может ли перезагрузка быть выполнена одним и тем же загрузчиком классов! –

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