2009-06-08 1 views
1

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

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

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

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

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

ответ

1

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

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

3

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

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

3

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

Вы используете JPDA? Если это так, вы можете получить method entry event, получить event's thread и прочитать аргументы от текущего stack frame. См. Это JPDA demo blog post, если вы не знакомы с ним.

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

0

я мог бы быть немного blury.

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

+0

Stackoverflow не форум темы. Поэтому, пожалуйста, не отправляйте ответы в ответ. Пожалуйста, разместите их в комментариях к указанному ответу. – guerda

0

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

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

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

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

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

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

0

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

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

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

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

1

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

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

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

+0

Спасибо за ваш комментарий.Взгляните на JPDA :) – corgrath

1
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, но если вы настроены против них, это может сделать то, что вы хотите.

+0

Спасибо за ваш комментарий. Как я писал Джеку Леоу, это требует от меня аргументов. Это хорошее решение, но я скорее развиваю что-то, поэтому мне нужно только вызвать PrintValues ​​(), и он будет автоматически перебирать аргументы :) – corgrath

0

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

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

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

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