2011-07-25 4 views
1

Я пытаюсь создать инструмент, который может захватить все чтения и записи, сделанные программой Java. Кроме того, я хотел бы знать, в каких областях доступен или изменен объект.Как поймать чтение и запись в java-программе?

В настоящее время я смотрел на: -

1) java.lang.instrument Я не мог делать с этим. Я не мог понять, как написать агента, который может получить доступ к запущенной программе и создать часы на разных объектах/полях и все, что связано. Я бы оценил, есть ли у вас какие-либо идеи или информация по этому поводу.

2) JVMTI Я смотрел на JVMTI и попытался создать JVMTI инструмент, но я понял, что, чтобы получить объекты, я бы нужен JVMTI_EVENT_OBJECT_ALLOC быть потенциальная возможность. Но я понял, что это не так. Более того, я читал, что это событие не вызывается для команда. Следовательно, на данный момент даже это не представляется возможным.

Итак, я хотел бы знать, знаете ли вы, каким образом вы делаете то, что я хочу делать, используя вышеупомянутые методы или любую другую технику/инструмент, о которых вы, возможно, знаете?

ПРИМЕЧАНИЕ. У меня нет доступа к исходному коду приложения. Все, у меня есть файлы классов.

+0

Являются ли файлы классов скремблированными или вы можете их декомпилировать? – Matt

+0

Привет, Мэтт, у меня есть приложения java как отдельные файлы jar. – Ankit

+0

Мой вопрос больше подходит: вы хотите решить проблему вообще или только для своего конкретного файла jar? – Matt

ответ

1

Это очень легко сделать с ASM lib. Создайте новый загрузчик классов, который устанавливает все классы перед загрузкой и использует его для загрузки целевых классов. Создайте новый MethodAdapter и переопределите метод visitFieldInsn. Затем найдите коды PUTFIELD, PUTSTATIC, GETFIELD и GETSTATIC. Хотя это может показаться страшным (поскольку мое объяснение, скорее всего, тарабарщина), на самом деле это довольно легко. Просто скачайте руководство ASM, и вы узнаете, как это сделать в кратчайшие сроки.

Редактировать: Я забыл сообщить, что для того, через аргумент командной строки -Xbootclasspath (java. * и некоторые другие пакеты, я считаю, что по крайней мере солнце. * и javax. * тоже нужно это).

Это также может быть выполнено с AspectJ ... но я не уверен.

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

  • Нет связанных вопросов^_^