Есть ли способ увидеть, какие значения аргументов, отправленных в метод в Java?

56
3

В настоящее время я работаю над инструментом обработки отладки/ошибок для моего проекта Java. Это длинный снимок, но есть ли способ распечатать значения аргументов, отправленных в метод?


JVM должен хранить их при вызове метода. В любом случае, я могу просто захватить эти ценности?


Моя цель состоит в том, чтобы просто вызвать собственный метод printArguments(), который должен - каким-то образом - распечатать аргументы, независимо от того, в каком именно методе он находится.


У кого-нибудь есть идеи, как я могу это решить? или, может быть, другая подобная информация, к которой я могу получить доступ? Я хочу получить как можно больше информации в определенное время, например, переменные.


Любые комментарии будут оценены!:)

спросил(а) 2009-06-08T12:01:00+04:00 11 лет, 3 месяца назад
1
Решение
58

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


В любом случае, нет возможности отразить доступ к локальным переменным в java, поэтому даже если аргументы были сохранены, вы не смогли бы получить их.


JPDA - единственный способ неинтрузивно получить доступ к аргументам метода, я боюсь.

ответил(а) 2009-06-08T16:10:00+04:00 11 лет, 3 месяца назад
105

Вы можете что-то сделать с AOP

http://www.devx.com/Java/Article/30799/1954

ответил(а) 2009-06-08T12:11:00+04:00 11 лет, 3 месяца назад
80

В настоящее время я работаю над инструментом обработки отладки/ошибок для моего проекта Java.



Используете ли вы JPDA? Если это так, вы можете получить событие ввода метода, получить поток событий и прочитать аргументы из текущего кадра . См. Этот сообщение JPO demo blog, если вы не знакомы с ним.

Если вы хотите избежать работы в режиме отладки, то (как утверждали другие) AOP является хорошим решением. Вы можете опрокинуть свое собственное решение, используя instrumentation и/или манипуляция с байтовым кодом, но это более привлекательный подход.

ответил(а) 2009-06-08T12:36:00+04:00 11 лет, 3 месяца назад
80

Это звучит как работа для АОП. Если вы используете Spring, есть простые решения.


Если вы хотите бросить свое решение вручную, вы можете использовать интроспекцию, чтобы получить всю необходимую информацию. Я бы предложил использовать прокси (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Proxy.html), чтобы обернуть классы, которые вы хотите зарегистрировать, и реализовать регистрацию в прокси.

ответил(а) 2009-06-08T12:16:00+04:00 11 лет, 3 месяца назад
57

void PrintValues(Object... params){
for(object o : params){
System.out.println(o.toString());
}
}

Затем в любом методе, который вам нужен, вы можете просто передать их в PrintValues, как это.


void SomeMethod(String p1, int p2, StringBuilder p3){
PrintValues(p1, p2, p3);
}

Я упрощаю требования? Похоже на то, что вы хотите, действительно будет хорошо подходит для AOP/reflection, но если вы настроены против них, это может сделать то, что вам нужно.

ответил(а) 2009-06-08T16:14:00+04:00 11 лет, 3 месяца назад
57

Возможно, VisualVM - это то, что вы ищете.


Если вы используете последнюю версию с самого начала, у вас уже есть visualvm


просмотрите эту ссылку, чтобы получить дополнительную информацию: http://java.dzone.com/articles/best-kept-secret-jdk-visualvm

ответил(а) 2009-06-08T13:05:00+04:00 11 лет, 3 месяца назад
57

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


Если у вас есть доступ к источнику Java, то для вас может работать аспектно-ориентированное программирование. Вы можете использовать его для автоматического переплетения вызова printArguments во все обычные вызовы метода.

ответил(а) 2009-06-08T12:11:00+04:00 11 лет, 3 месяца назад
41

Я не совсем уверен в ваших требованиях, но вы взглянули на BTrace. Вы можете делать именно то, что хотите.


Кроме того, вы можете использовать средство обработки отладки/обработки ошибок в BTrace - предоставить набор сценариев, специфичных для вашего приложения, а затем запустить их в режиме ad-hoc. GalssFish v3 делает что-то подобное.

ответил(а) 2009-12-30T13:09:00+03:00 10 лет, 9 месяцев назад
40

Если вы хотите полагаться только на библиотеки JDK (1.4+), единственное, о чем я могу думать, это добавить запись во все ваши методы, например,


(Я использую синтаксис ведения журнала Commons, поскольку я не знаком с особенностями ведения журнала Java)


public void foo(String bar) {
log.debug("entering foo(" + bar + ")");
//...
}

ответил(а) 2009-06-08T15:29:00+04:00 11 лет, 3 месяца назад
40

Теперь я прочитал целую кучу, но я все еще не уверен, что использовать.


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


Это сводится к JPDA и AOP, оба кажутся сложными, поэтому они должны:) Я не уверен, что тем легче из двух, которые я могу использовать в одной и той же среде исполнения, без запуска приложения в режиме отладки или создания письменного что-то на новом OAP-языке.


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


В теории я могу получить имя метода и типы аргументов, благодаря отражению. Но не их значения.


Любой ответ будет полезен.

ответил(а) 2009-06-08T15:17:00+04:00 11 лет, 3 месяца назад
41

Возможно, я немного смутился.


Это стандартный проект J2SE. Используя стандартный компилятор och runtime, ничего необычного. Я хочу как можно больше использовать библиотеку J2SE, а не включать новые библиотеки в проект или использовать внешний инструмент, такой как Eclipse, поскольку он будет dist. к машинам без разработки.

ответил(а) 2009-06-08T13:35:00+04:00 11 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема