我想知道方法的执行顺序。假设我有一个带有一些方法的A类
Class A{
methodA(){
line 1;
line 2;
.
.
.
line n;
}
methodB(){
line a;
line b;
.
.
.
line n;
}
}
现在我有一个打印消息的课程
Class B{
printMessage(){
System.out.println("method name and line number of callee");
}
}
现在有办法执行printMessage()
每次line 1, line 2,...line n
执行printMessage()
而不在methodA()
或methodB()
中的每一行后写(3)
(2,1)
(1,1,1)
。
我已经知道如何调试,我只是想为了方便而编写一些实用程序类。谢谢。
答案 0 :(得分:0)
是的,你可以,但这非常复杂,它可以重新编写你在eclipse中使用的调试器(假设你使用它)并且它非常严格。我在这个问题中做了一个相同的答案:Trace java bytecode stream OP想要写每个字节码行。您可能会感兴趣的链接。
在您的情况下,Class B
将在Class A
以外的其他程序中。因此,您将拥有一个名为“myDirtyDebugger”的应用程序,该应用程序使用classA(使用-g编译)通过jdb
启动您的其他应用程序,类似Process
类。在你想要的地方设置断点(methodA()
的开头),然后在“myDirtyDebugger”中逐步开始,打印出每一行(你可以用Process
类来获取它们)。
创建一个启动jdb
的Java应用程序,它反过来启动你的应用程序,听起来很糟糕,而且确实如此。 jdb
有点是JVM TI的默认实现,因此您可以使用JVM TI制作自己的(更干净的?)调试器。如果没有对此有所了解的人,我不建议将其用于专业目的,但对于好奇的人来说,这可能是一个有趣的练习。
我怀疑开发这个比使用调试器或任何日志框架进行单元测试更快。
编辑:
我认为没有更简单的方法来做你想做的事。所以这就是为什么我写这么难的原因。但后来我想:有代码生成框架,也许还有代码分析/重写framewrok工具呢?好吧,有:Editing/Modifying a .java file programmatically? (not the .class file)
Java的Spoon框架允许您在源代码中搜索,读取和修改或生成类,方法和表达式。因此,在您的方法中的每个表达式之间添加一个日志(或对另一个类的调用)对此来说听起来并不那么困难。他们的网站上有一些examples。我没有仔细阅读,所以我无法向你解释如何做到这一点,但这是一个好的开始。