ведение журнала вызовов методов без внешнего инструмента или внешней библиотеки в java

#java #multithreading #debugging #logging

#java #многопоточность #отладка #ведение журнала

Вопрос:

Я пытаюсь создать класс Java, который будет регистрировать вызовы методов многопоточной Java-программы. У меня уже есть часть, в которой он может сохранять информацию в файл на рабочем столе, но мне не удалось найти способ получить вызовы методов. Я пытался использовать Runtime.getRuntime().traceMethodCalls(true) и использовать Thread.getAllStackTraces().values() и перебирать элементы StackTraceElement . Посетите https://github.com/NamelessSuperCoder/Class-Debugging.git чтобы увидеть мой текущий код. Пожалуйста, скажите, что я должен сделать для улучшения и как заставить мои классы работать.

Ответ №1:

Может оказаться невозможным протоколировать все вызовы методов без буквального написания инструкции log для каждого метода или без внешнего инструмента. Вероятно, самый простой способ выполнить эту задачу — использовать аспектно-ориентированное программирование с помощью такого инструмента, как AspectJ. На самом деле, я даже нашел статью о том, как это сделать, http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html . Возможно, вы сможете создавать свои собственные инструменты, используя прокси для всех ваших классов.

Комментарии:

1. есть ли какой-то другой способ? потому что я не могу заставить AspectJ работать над моим текущим проектом wpilib java

Ответ №2:

Имейте ссылку на ваш класс ведения журнала в вашем другом классе. Установите класс ведения журнала как одноэлементный, чтобы существовал только один его экземпляр. Дайте ему некоторый метод, который принимает строку для помещения в журнал, а затем вызовите метод в классе ведения журнала из методов вашего другого класса…

 class Logger {

    static addLogEntry(String logEntry) {
        // some method to add log entry to your log
    }
}


class Foo {

    Logger aLogger;

    public Foo() {
        // get your singleton Logger instance
        aLogger = getLogger();
    }

    public void someMethodInThisClass() {
        aLogger.addLogEntry("in someMethodInSomeClass");
    }


}
  

возможно, это более элегантный способ сделать это, но это должно сработать.

Комментарии:

1. это не совсем то, что я хотел, я хочу иметь класс, который во время выполнения может получать все вызовы методов и сохранять их в файле.