Java,如何跟踪调用的函数

我想跟踪Java中调用的函数的开始[和结束],如下面的代码:

public void foo() { System.out.println("begin of foo()"); ... System.out.println("end of foo()"); } 

但是维护转储代码System.out.println是一件单调乏味且容易出错的事情,因为类中可能有数十个函数。

任何好主意都可以缓解这项工作? 我不想在整个文件中使用转储语句。

执行两者或其中一个开始和结束跟踪是最好的。
但是,如果不可能,那么调用该函数的记录也很有帮助。 我的意思是不关心确切的开始和结束,只是告诉该函数已被调用。

最简单的方法是你选择的方法。

System.out调用的一个简单替代是使用日志框架。 然后,您可以根据选定的“日志记录级别”打开和关闭信息

更复杂的解决方案将使用面向方面的编程技术(例如,由AspectJ提供),但这会使您陷入陡峭的学习曲线。

也许基于工具的方法可以满足您的需求:所谓的“分析器”可以“检测”您的代码并准确报告在运行期间调用的方法。

另一种方法是使用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的体验更加愉快。

如果有许多方法需要记录,可以使用AOP 。 例如,aspectJ。

您可以使用log4j:

 static Logger log = Logger.getLogger( log4jExample.class.getName()); public void loggedMethod() { log.info("begin of loggedMethod()"); ... log.info("end of loggedMethod()"); }