Есть ли способ узнать, какие значения аргументов отправляются в метод в Java? - PullRequest
1 голос
/ 08 июня 2009

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

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

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

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

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

Ответы [ 11 ]

6 голосов
/ 08 июня 2009

Вы должны быть в состоянии что-то сделать с AOP

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

3 голосов
/ 08 июня 2009

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

Используете ли вы JPDA ? Если это так, вы можете получить событие входа в метод , получить поток события и прочитать аргументы из текущего стека фрейма . Посмотрите этот демонстрационный блог JPDA , если вы не знакомы с ним.

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

3 голосов
/ 08 июня 2009

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

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

1 голос
/ 08 июня 2009
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);
}

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

1 голос
/ 08 июня 2009

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

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

Боюсь,

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

1 голос
/ 08 июня 2009

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

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

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

1 голос
/ 08 июня 2009

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

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

0 голосов
/ 30 декабря 2009

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

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

0 голосов
/ 08 июня 2009

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

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

public void foo(String bar) {
    log.debug("entering foo(" + bar + ")");
    //...
}
0 голосов
/ 08 июня 2009

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...