【问题标题】:Is it possible to call a class (A) method inside another class(B) method each time a line has executed每次执行一行时,是否可以在另一个类(B)方法中调用一个类(A)方法
【发布时间】:2016-11-24 20:47:35
【问题描述】:

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

现在有什么方法可以在每次执行line 1, line 2,...line n 时执行printMessage(),而无需在methodA()methodB() 的每一行之后写入printMessage()

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

【问题讨论】:

  • 不是,不是。您可以研究面向方面的编程和 AspectJ,或动态代码重写,但实际上这不是您想做的事情;如果您认为自己想这样做,则需要重新考虑如何编写方法。
  • 看起来像调试...
  • 请问打印出每一行执行的目的是什么?
  • 感谢您的回复,但如果我们能够做到这一点,我认为在逆向工程方面编程会容易得多。
  • 这看起来像XY problem。你真正想做什么?

标签: java


【解决方案1】:

是的,你可以,但这很复杂,它可以追溯到重写你在 Eclipse 中拥有的调试器(假设你正在使用它)并且它非常有限制。我在这个问题上做了一个等效的答案:Trace java bytecode stream OP 想要在其中写入每个字节码行。您可能会感兴趣的一些链接。

在您的情况下,Class B 将位于除 Class A 之外的另一个程序中。因此,您将拥有一个名为“myDirtyDebugger”的应用程序,该应用程序使用 classB 启动您的另一个应用程序,通过 jdb 使用类似于 Process 类的 classA(使用 -g 编译)。在您想要的位置设置一个断点(methodA() 的开头)并开始在“myDirtyDebugger”中逐步执行,打印出每一行(我猜你可以使用Process 类来获取它们)。

创建一个启动 jdb 的 java 应用程序,然后启动您的应用程序,这听起来很糟糕,但确实如此。 jdb 是 JVM TI 调试的默认实现,因此您可以使用 JVM TI 制作您自己的(更清洁的?)调试器。我不建议在没有这方面知识的人的情况下将其用于专业目的,但对于好奇的人来说,这可能是一个有趣的练习。

我怀疑开发它会比使用调试器或任何日志框架进行单元测试更快。


编辑:

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

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

【讨论】:

  • 谢谢,但我不需要这么复杂的方法来完成这样的事情。
  • @Nazim 我也这么认为,我用您可能更感兴趣的内容编辑了这个问题。老实说,它仍然很复杂,但要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多