2016-11-23 49 views
0

每次我想知道的方法的执行的序列称之为内的另一个类(B)方法的类(A)方法。假设我有一些方法是否有可能的线已经执行

Class A{ 
    methodA(){ 
     line 1; 
     line 2; 
     . 
     . 
     . 
     line n; 
    } 
    methodB(){ 
     line a; 
     line b; 
     . 
     . 
     . 
     line n; 
    } 
} 

A类现在我有一类消息打印

Class B{ 
    printMessage(){ 
     System.out.println("method name and line number of callee"); 
    } 
} 

现在是有每次line 1, line 2,...line n获得无每行之后写printMessage()执行的任何方式来执行printMessage()methodA()methodB()

我已经知道如何调试,我只想写一些实用工具类,为了我的方便。谢谢。

+7

不是真的,没有。你可以研究面向方面的编程和AspectJ,或者动态代码重写,但实际上这不是你想要做的;如果你认为你想这样做,你需要重新思考你如何编写方法。 –

+2

似乎像调试... – passion

+3

我可以问打印出每一行执行的目的是什么? – swinkler

回答

0

是的,你可以,但是这是非常复杂的,它可以追溯到重写你在eclipse有调试器(假设你使用它),这是相当严格的。我在这个问题上做了一个等效的回答:Trace java bytecode stream其中OP想写每个字节码行。有几个链接可能会让你感兴趣。

在你的情况,Class B会在另一个程序比Class A。因此,您将拥有一个名为“myDirtyDebugger”的应用程序,其classB通过jdb与类别(用-g编译)启动您的其他应用程序,类似Process类。在你想要的地方设置一个断点(从methodA()开始),并开始在“myDirtyDebugger”中逐步进行,打印出每一行(你可以通过Process这个类来获得它们)。

制作启动jdb,这反过来启动您的应用程序,听起来很可怕的Java应用程序,它是。 jdb是JVM TI的默认实现,因此您可以使用JVM TI创建您自己的(清洁器?)调试器。如果没有知识的人,我不建议将其用于专业目的,但对于那些好奇的人来说,这可能是一个有趣的练习。

而且我怀疑,深化发展,这将是比任何做单元测试,使用调试器或为您prupose任何日志框架更快。


编辑:

我想不会有做你想要的东西更简单的方法。所以这就是为什么我写了艰难的方式来做到这一点。但后来我想:有代码生成框架,也许有代码分析/重写framewrok工具呢?那么,有:Editing/Modifying a .java file programmatically? (not the .class file)

用于Java的Spoon框架允许您在源代码中搜索,读取和修改或生成类,方法和表达式。所以,在你的一个方法中的每个表达式之间添加一个日志(或者调用另一个类)听起来并不那么困难。他们的网站上有几个examples。我没有仔细阅读,所以我不能真正向你解释如何去做,但这是一个好的开始。

+0

谢谢,但我不需要如此复杂的方法来完成这样的事情。 – Nazim

+0

@Nazim我也这么认为,我编辑了一些可能更感兴趣的问题。老实说它仍然复杂,但更容易。 – Asoub