Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по работе c JDI / 6 сообщений из 6, страница 1 из 1
05.10.2012, 16:37:22
    #37985686
aby_2503
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по работе c JDI
Вопрос в следующем - необходимо запустить выполнение метода отлаживаемого класса:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ObjectReference thisObject = virtualMachine.classesByName("com.cdp.TestClass").get(0).instances(100).get(0);

                        Field controlPanelField = thisObject.referenceType().fieldByName("controlPanel");
                        ObjectReference controlPanelObject = (ObjectReference) thisObject.getValue(controlPanelField);
                        if (controlPanelObject != null) {
                            Field clickListener = controlPanelObject.referenceType().fieldByName("listener");
                            ObjectReference clickListenerObject = (ObjectReference) controlPanelObject.getValue(clickListener);
                            Method method = clickListenerObject.referenceType().methodsByName("click").get(0);


                            List<Value> arguments = new ArrayList<Value>();
                            arguments.add(null);
                            arguments.add(virtualMachine.mirrorOf(0f));
                            arguments.add(virtualMachine.mirrorOf(0f));
                            System.out.println(clickListenerObject.invokeMethod(invokeThread, method, arguments, 0));
                        }


Проблема в том, что если его выполнить не в блоке обработки событий BreakpointEvent, то вылетает сообщение - IncompatibleThreadStateException .
...
Рейтинг: 0 / 0
05.10.2012, 16:44:50
    #37985712
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по работе c JDI
Так это ожидаемо и логично. Метод можно выполнить только во время остановки на конкретной breakpoint. Отсюда и это ограничение.
...
Рейтинг: 0 / 0
05.10.2012, 16:48:13
    #37985722
aby_2503
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по работе c JDI
Blazkowicz,ну хорошо. Я допустим, думаю, что логично было также выполнять метод при выполнении MethodExitEvent или MethodEnterEvent, к примеру.
...
Рейтинг: 0 / 0
05.10.2012, 16:57:33
    #37985742
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по работе c JDI
aby_2503Я допустим, думаю, что логично было также выполнять метод при выполнении MethodExitEvent или MethodEnterEvent, к примеру.
Необосновано. JDI это отладка. Когда останавливается breakpoint, у вас есть некий Frame - текущее состояние потока. В контексте этого фрейма вы можете выполнять методы, делать другие вычисления и смотреть значения переменных.
В других событиях, которые не Breakpoint/Watchpoint поток ведь не приостанавливается. И никакого текущего фрейма при этом нет.
Если вам нужно просто абстрактный код выполнить по событию, то это ведь через рефлексию можно сделать.
...
Рейтинг: 0 / 0
05.10.2012, 17:09:57
    #37985762
aby_2503
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по работе c JDI
Blazkowicz, я хочу использовать JDI для тестирования. Моя цель - после запуска приложения, сэмулировать последовательность нажатий на кнопки (на их listeners поставить breakpoints и уже в этих breakpoints сравнивать полученные значения). А на счет рефлексии, на сколько я понимаю, то с помощью JDI я не смогу достучаться до экземпляра интересующего меня класса. Максимум, что я смогу получить - ObjectReference этого объекта.
...
Рейтинг: 0 / 0
05.10.2012, 17:19:54
    #37985774
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по работе c JDI
aby_2503Blazkowicz, я хочу использовать JDI для тестирования.
ОК

aby_2503Моя цель - после запуска приложения, сэмулировать последовательность нажатий на кнопки (на их listeners поставить breakpoints и уже в этих breakpoints сравнивать полученные значения).
Если речь про Swing, то этот подход не будет работать. В GUI критично чтобы события выполнялись в Event Dispatch Thread. Поэтому нормальный способ это создать событие и положить в EventQueue. Иначе GUI сломается.

aby_2503А на счет рефлексии, на сколько я понимаю, то с помощью JDI я не смогу достучаться до экземпляра интересующего меня класса. Максимум, что я смогу получить - ObjectReference этого объекта.
JDI работает только в контексте bootstrap загрузчика?

Ну и используйте BreakPoint-ы. Зачем вам Method Entry/Exit?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по работе c JDI / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]