每次执行一行时,是否可以在另一个类(B)方法中调用类(A)方法

时间:2016-11-23 08:44:33

标签: java

我想知道方法的执行顺序。假设我有一个带有一些方法的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)

我已经知道如何调试,我只是想为了方便而编写一些实用程序类。谢谢。

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。我没有仔细阅读,所以我无法向你解释如何做到这一点,但这是一个好的开始。