2015-05-26 2 views
2

Я работаю над небольшой онлайн-игрой на Java, которая, хотя и не закончена, я хочу ее выпустить в какой-то момент. Я не вижу, чтобы это было закончено в ближайшее время, однако все, что не хватает, - это некоторые детали продолжения истории. Я подумал о том, чтобы обновлять обновления в игре через интернет-соединение (как это делают большинство игр), но я хотел быть умным с ним и использовать некоторую форму горячей замены для исправления обновлений, не перезагружая игру.Java-классы с горячей заменой

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

Как я себе этот процесс:

  1. сервер сообщает клиенту, что есть обновление доступно
  2. загрузки клиента ZIP/JAR/все и извлекает его
  3. Клиент загружает в «классе пакет», который (Клиент имеет специально сконструированные части, предназначенные для обработки загрузки в дополнительных классах &, возможно, переписывая существующие классы.)
  4. «класс пакета» обрабатывает перезапись представления класса в памяти s.

Часть, которая меня беспокоит то, что если у меня есть объект, т.е.

//Something that's called when the app loads up 
    CustomClass drawClass = new CustomClass(); 
    drawClass.setContext(Context.MAIN); 
    //...More calls that set up drawClass 

Я хочу, чтобы иметь возможность изменять CustomClass и он отражается во всех случаях CustomClass. Единственная причина, по которой я надеюсь, заключается в том, что я могу создать для каждого класса «copyMe» вещь, которая по существу сериализует его, - которая может быть загружена в новый класс.

Могу ли я это сделать? Если да, то как?

+0

Это похоже на то, что вы хотели бы изучить: http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html –

+0

Сторона примечания: когда у вас есть «удаленный» доступ к ваш JVM; то вы можете использовать JRebel для этого. Думаю, я не сделал бы этого таким образом (но стремиться к более «архитектурному» пути); но я думаю, что использование JRebel может работать на вас.(при условии, что вы готовы заплатить лицензионную стоимость за свою небольшую онлайн-игру) – GhostCat

+0

JRebel не предназначен для использования в производстве, и он не восстанавливает уже построенные объекты при смене класса, если только плагин не отслеживает соответствующие экземпляры и специально подключен для этого. –

ответ

1

Я думаю, вы могли бы решить некоторые из требуемой функциональности с использованием SPI

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

Хотя я думаю, вам нужно найти пользовательскую сериализацию, которую вы можете повторно использовать над этими классами. Например, вы можете использовать gson и сериализовать интересные поля до json. Более новые реализации могут десериализоваться, и вы получили поддержку для управления версиями и т. Д.

1

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

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