我想追查开始[& Java中调用的函数的结尾,如下面的代码:
public void foo() {
System.out.println("begin of foo()");
...
System.out.println("e-n-d of foo()");
}
但是维护转储代码System.out.println
是一件单调乏味且容易出错的事情,因为一个类中可能有数十个函数。
任何好主意都可以缓解这项工作吗?我不想在整个文件中使用转储语句。
实施两者或其中一个开始&结束痕迹是最好的。
但是,如果不可能的话,已经调用该函数的记录也很有帮助。我的意思是不关心确切的开始和结束,只是告诉函数已被调用。
答案 0 :(得分:9)
另一种方法是使用BTrace - 它类似于AspectJ,但可以附加到正在运行的java应用程序并动态应用日志代码(它也可以从应用程序中分离,删除所有注入的代码,但在使用 BTrace )
之前让应用程序保持运行状态为了使用 BTrace ,您可以编写一个简单的跟踪脚本,该脚本是使用 BTrace 注释注释的POJO(以及关于可以使用什么来避免崩溃的一些限制)目标应用)。
在这种情况下,脚本将如下所示:
@BTrace public class FooTracer {
@OnMethod(clazz="Bar", method="foo")
public static void onEntry() {
println("begin of foo()");
}
@OnMethod(clazz="Bar", method="foo", location=@Location(Kind.RETURN))
public static void onExit() {
println("end of foo");
}
}
使用 BTrace 可以做更多的事情 - 只需参阅用户指南和示例。名义上,它是控制台应用程序,但已集成到VisualVM,使得使用 BTrace 的体验更加愉快。
答案 1 :(得分:2)
最简单的方法是你选择的方法。
System.out
调用的简单替代是使用日志框架。然后,您可以根据选定的“日志记录级别”打开和关闭信息
更复杂的解决方案将使用面向方面的编程技术(例如,由AspectJ提供),但这会让您陷入陡峭的学习曲线。
也许基于工具的方法可以满足您的需求:所谓的“分析器”可以“检测”您的代码并准确报告在运行期间调用的方法。
答案 2 :(得分:2)
如果有很多方法需要记录,可以使用 AOP 。例如,aspectJ。
答案 3 :(得分:0)
您可以使用log4j:
static Logger log = Logger.getLogger(
log4jExample.class.getName());
public void loggedMethod() {
log.info("begin of loggedMethod()");
...
log.info("e-n-d of loggedMethod()");
}