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


Автор: lazycat 26.9.2014, 16:51
Доброго времени суток всем!

Возникла проблема. Чтобы было лучше понятно, сначала небольшой бекграунд.

Есть работающее приложение. Куча кода и куча библиотек. Надо понять, как работают некоторые методы класса. Излишне говорить, что документации никакой. Как я привык (да и многие другие тоже) прогоняю приложение на реальных данных и смотрю, что происходит, структуру объектов, приходящих в качестве параметров и т.д. Вот только получить эти реальные данные крайне сложно: нужна согласованная работа многих людей.

После того, как бекграунд описан, описываю саму проблему. Хотелось бы захватить текущее состояние нескольких объектов, после чего прогонять требуемые методы можно было бы хоть до бесконечности. Но ... многие классы определены в библиотеках и они не имплементируют Serializable. JAXB не могу использовать по той же причине - не могу дотянуться до классов, чтобы аннотировать их.

И, наконец, вопрос: знает ли кто-нибудь способ сделать "snapshot" объекта, не изменяя исходный код его класса. Захватить нечто вроде байтовой последовательности, а потом восстановить его в виде Java объекта. 
И возможно ли это вообще?

Буду крайне благодарен за любой совет и любое высказанное мнение по этому вопросу.

Автор: baldina 26.9.2014, 17:55
Цитата(lazycat @  26.9.2014,  16:51 Найти цитируемый пост)
прогоняю приложение на реальных данных и смотрю, что происходит

Стругацкие, "Попытка к бегству"

Автор: lazycat 26.9.2014, 18:07
Цитата(baldina @  26.9.2014,  17:55 Найти цитируемый пост)
Стругацкие, "Попытка к бегству" 


А по сути мысли есть?

Автор: LSD 2.10.2014, 15:20
Не понятна задача. Тебе надо в работающей системе сереализовывать объекты. Или "под дебагом" посмотреть содержимое?

Автор: lazycat 23.10.2014, 14:34
Цитата(LSD @  2.10.2014,  15:20 Найти цитируемый пост)
Не понятна задача. Тебе надо в работающей системе сереализовывать объекты. Или "под дебагом" посмотреть содержимое? 


LSD, спасибо за желание помочь. Прошу прощения за долгое молчание.

Несмотря на то, что дикими усилиями основная задача решена, считаю, что вопрос сам по себе достаточно интересен и достоин обсуждения.

Итак, уточняю ситуацию.

В принципе мне надо было "под дебагом" посмотреть, как ведет себя метод, как он обрабатывает реальные данные. Надо это для того, чтобы внести небольшие изменения и ничего не сломать при этом.

Параметры метода - сложные объекты, сам я их создать не могу, создаются библиотечным кодом, исходников нет. Поставить точку останова - не могу, т.к. реально приложение можно запустить только на серваке, где он взаимодействует с другими модулями.
Так вот возникла у меня идея: нельзя ли сделать "граббер" параметров. Тогда я бы запустил на серваке модуль с граббером, захватил реальные параметры, а потом уже издевался над кодом локально.
Отсюда и возник первоначальный вопрос: нет ли какого-то способа захватывать объекты в текущем состоянии, а потом использовать их при вызове метода. Битовая карта здесь не пройдет, т.к. в объектах списки и прочие динамические данные. Сериализация также не катит, т.к. объект в библиотеке не имплементит Serializable, а исходного кода нет. Одним словом, так как описано в первом посте.

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

Автор: LSD 23.10.2014, 16:15
В общем случае тебе надо снапшот не только одного объекта, а вообще всего дерева и значит потенциально вообще всей JVM, а значит и вообще всей ОС. Такой механизм есть в вируальных машинах. Это все в общем случае, когда потенцильно метод может изменить любой другой объект и иметь побочное воздействие на ОС в целом.

Если же производимые изменения локальны, то тут хватит http://en.wikipedia.org/wiki/Transactional_memory. Есть как программные так и аппаратные реализации, но опять же тут требуются усилия по поддержке со стороны программиста. В приницпе добавить в POJO сериализацию ничего сложного нет, тот же Hibernate прекрасно это делает, просто модифицируя байткод класса при загрузке.

P.S. А дебажить удаленные сервер, не сложнее чем локальный.

Автор: lazycat 23.10.2014, 16:36
Цитата(LSD @  23.10.2014,  16:15 Найти цитируемый пост)
В общем случае тебе надо снапшот не только одного объекта, а вообще всего дерева и значит потенциально вообще всей JVM, а значит и вообще всей ОС. Такой механизм есть в вируальных машинах. Это все в общем случае, когда потенцильно метод может изменить любой другой объект и иметь побочное воздействие на ОС в целом.


Всего дерева - конечно же да.

Цитата(LSD @  23.10.2014,  16:15 Найти цитируемый пост)
метод может изменить любой другой объект и иметь побочное воздействие на ОС в целом


Теоретически, да, но в моем случае до этого не доходило.


Цитата(LSD @  23.10.2014,  16:15 Найти цитируемый пост)
добавить в POJO сериализацию ничего сложного нет, тот же Hibernate прекрасно это делает


Это мне надо осмыслить ...

Спасибо за идею !

Автор: RageSteel 24.10.2014, 07:23
А в чём проблема запустить этот удалённый сервер под Debug'ом?

А ещё JVM можно попросить сделать дамп памяти, а потом по нему походить.

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