Ищете более простой способ написания отладочных операторов печати в Java - PullRequest
9 голосов
/ 06 августа 2009

РЕДАКТИРОВАТЬ: Я хотел бы прочитать реакции на АОП подход Стива Рида. Комментарии к его ответу приветствуются!

Я новичок, и в какой-то момент я понял, что было бы полезно знать содержимое переменной во время выполнения программы. Итак, я начал делать это:

РЕДАКТИРОВАТЬ: исправлено. Раньше было: var + ":" + var, что было совершенно неверно. Тупая опечатка.

System.err.println ( "var: " + var );

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

Я использую базовый текстовый редактор, и каждый раз, когда мне нужно отладить переменную, я печатаю оператор print довольно утомительно, поэтому я подумал, почему бы не что-то вроде этого:

void dbug ( Object obj )
{
    String variableName = obj.somehowGetVariableName();
    String variableContents = obj.toString();
    System.out.println ( variableName +": " + variableContents );
}

Но очевидно, что получить имя переменной легче, чем сделать.

Java-отражательные как к-получить-имя-в-а-переменного

Я застрял с:

System.err.println ( "var: " + var );

Или есть популярная сокращенная версия этого?

Ответы [ 11 ]

0 голосов
/ 06 августа 2009

Вы можете получить доступ к именам переменных с помощью AOP и ткачества во время компиляции. Хорошая вещь в этом заключается в том, что если вы не выполняете переплетение, вы не добавляете код журнала отладки, и ваш код времени выполнения в результате становится меньше и быстрее.

Вот пример использования AspectJ для выдачи исключения, когда для поля установлено значение NULL. Обратите внимание на использование «joinPoint.getSignature()» для получения доступа к метаданным кода.

@Aspect
public class NotNullValidator {

   @Pointcut(value = "set(@com.acme.NotNull * *.*) && args(valueBeingSet)")
   private void setOfNonNullField(final Object valueBeingSet) { }

   @Before(value = "setOfNonNullField(valueBeingSet)")
   public void validate(final JoinPoint joinPoint, final Object valueBeingSet) {
      if (valueBeingSet == null) {
         throw new NullPointerException("Cannot set " + joinPoint.getSignature().getName() + " to null.");
      }
   }
}

См. JoinPoint Javadoc , чтобы узнать, что еще можно получить (номера строк, исходные и целевые объекты и т. Д.).

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