Инструментарий исходных файлов Java с заявлениями System.out.println? - PullRequest
0 голосов
/ 02 июня 2009

Я ищу простой способ (скажем, один скрипт / пакетный файл или простую программу) для обработки набора исходных файлов Java, чтобы каждый метод имел добавленную инструкцию System.out.println при входе и выходе.

Я не смог найти такую ​​утилиту. Причина, по которой я нуждаюсь в этом (и почему он должен работать с исходными файлами, а не с файлами .class), заключается в том, что целевая система является встроенной системой Java.

Спасибо заранее, PD

Ответы [ 5 ]

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

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

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

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

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

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

Я написал расширение для slf4j, которое обеспечивает требуемую функциональность (за исключением вызова регистратора вместо System.out, но отправлять вызовы регистратора в System.out просто).

Взгляните на http://www.slf4j.org/extensions.html#javaagent

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

Я согласен с Kees, вы должны использовать Aspect Oriented Programming, чтобы автоматически добавлять логирование в каждую функцию. Я делаю что-то подобное для синхронизации со следующим кодом:

import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.util.StopWatch;

@Aspect
public class ProfilingAspect {

    @Around("methodsToBeProfiled()")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
        StopWatch sw = new StopWatch(pjp.getSignature().getClass().getSimpleName());
        try {
            sw.start(pjp.getSignature().getName());
            return pjp.proceed();
        } finally {
            sw.stop();
            LogFactory.getLog(pjp.getSignature().getClass()).debug(sw.shortSummary());
        }
    }

    @Pointcut("execution(public * *.*(..))")
    public void methodsToBeProfiled(){}
}

Это довольно простой вид, который вы можете добавить. Ключевыми частями являются аннотации pointcut, которые заявляют, что вы хотите, чтобы этот аспект применялся к каждому общедоступному методу каждого публичного класса в каждом пакете, независимо от его типа возвращаемого значения или входных параметров. Вы, вероятно, хотите сделать это более конкретным. Аннотация @Around ссылается на pointcut и задает набор кода, который вы хотите выполнить «вокруг» функции. В вашем случае, если вы хотите войти только в вызываемую функцию, вы можете заменить @Around на @Before или @AfterReturning в зависимости от того, где вы хотите вести журнал. Если вы делаете всю сборку приложения, стремитесь к «переплетению времени компиляции», а не времени загрузки. Это уменьшает требования времени выполнения вашего приложения.

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

Я делал это раньше, когда застрял в ситуации, когда больше ничего не работает. На самом деле я вошел и вставил sysout через каждые две строки, как только у меня был правильный метод.

(Например, я просто работал над JVM, где RMI-вызовы, которые вызывали исключение, молча съедались, а вызывающий поток просто зависал на неопределенное время! О, и, конечно, мы не могли использовать отладчик. Как еще вы найти что ??)

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

Если ваша нить «исчезает» в одной строке или делает неожиданный поворот, разбейте эту цепочку на минимальные пригодные для выполнения куски, выясните, какая часть не удалась, затем погрузитесь в нее и повторите - больше ничего не нужно делать.

Кстати, еще один полезный инструмент - даже на очень старой JVM, в любой момент вы можете добавить "(new Exception ()). PrintStackTrace ();"; выгрузить стек без влияния на поток программы. Если вы оказались в каком-то месте и не знаете, как туда попали, это может помочь.

Наконец, если вы хотите быть очень ленивым, вы можете использовать один статический метод для выполнения всех ваших выводов отладки (тот, который просто делегирует System.out.println), и добавить пару строк для получения трассировки стека, захватить только строку / метод "Вызов" и распечатайте его перед оператором отладки, что даст вам утилиту ведения журнала для бедняков.

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

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