#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. это не совсем то, что я хотел, я хочу иметь класс, который во время выполнения может получать все вызовы методов и сохранять их в файле.