Проблема в общих чертах является модель безопасности Java, которая на самом деле пытается предотвратить это класс, который имеет уже загружен снова загружен.
Конечно, Java с самого начала поддерживала динамическую загрузку классов, что сложно - это перезагрузка класса.
Было сочтено вредным (и по уважительной причине), что запущенное приложение Java было введено новым классом с помощью вредоносного кода. Например, java.lang.String взломал реализацию, исходящую из Интернета, вместо того, чтобы создавать строку, удаляет некоторый случайный файл hile, вызывающий метод length().
Таким образом, для них была разработана Java (и я предполагаю, что .NET CLR, потому что она была очень «вдохновлена» в JVM) заключалась в том, чтобы предотвратить загрузку уже загруженного класса снова той же виртуальной машины.
Они предложили механизм для переопределения этой «функции». Classloaders, но опять же правила для загрузчиков классов были, они должны спросить разрешение «родительского» загрузчика классов перед попыткой загрузить новый класс, если родитель уже загрузил класс, новый класс игнорируется.
Например, я использовал загрузчик классы, которые загружают классы из LDAP или RDBMS
Горячего развертывание становится необходимостью в мире Java, когда сервер приложений стали основным для Java EE (а также создает потребность в микро-контейнеры как весна, чтобы избежать такого рода бремени).
Перезагрузка всего сервера приложений после каждого компилятора приводит к тому, что любой сходит с ума.
Таким образом, поставщик приложений, предлагающий этот «пользовательский» загрузчик классов для быстрого развертывания и использования конфигурационного файла, это поведение, СЛЕДУЕТ быть отключенным при установке в процессе производства. Но компромисс заключается в том, что вы должны использовать тонны памяти в процессе разработки. Таким образом, хороший способ сделать это - перезапустить каждые 3 - 4 развертывания.
Это не происходит с другими языками, которые были разработаны с самого начала, чтобы загрузить их классы.
В Ruby, например, вы даже можете добавлять методы к запущенному классу, переопределять метод во время выполнения или даже добавлять один метод к уникальному определенному объекту.
Компромисс в таких условиях - это, конечно, память и скорость.
Надеюсь, это поможет.
EDIT
Я нашел этот продукт некоторое время назад, что обещает, что перезаряжает сделать как можно более простым. Я не помнил ссылку, когда я впервые написал этот ответ, и я это делаю.
Это JavaRebel from ZeroTurnaround
Почему это сообщество Wiki, кстати? – Eddie
Думал, что это может помочь в случае, если я оставил что-то непонятное ... сделайте это по умолчанию, это плохой этикет? –
Забавный: нашел, подумал-о, перечитывая сейчас, спасибо! –