【问题标题】:Java: How to identify if a class calls a specific methodJava:如何识别类是否调用特定方法
【发布时间】:2019-02-11 23:13:08
【问题描述】:

是否可以使用反射来识别特定 java 类中的某些方法是否在构建时调用另一个方法?

假设我有

  • 声明methodA1()的ClassA
  • 声明methodB1()、methodB2()、methodB3()的ClassB

我想知道,在构建时,ClassB 的任何成员是否调用了 methodA1()。这可能吗?

我现在正在使用 JDK8。

我很惊讶我找不到这个问题,这让我觉得它很幼稚。

谢谢!

【问题讨论】:

  • 你想在运行时知道这个,还是编译时知道?
  • 对不起,我在运行时需要这个,而不是编译时。我将它用于许多使用共享包的库中的一些自动化文档。我会更新问题。
  • 您是否需要在不实际致电methodB1 的情况下知道这一点?间接调用(methodA -> methodC -> methodB)怎么样?
  • 你在运行时需要什么?可以在构建时生成文档,不是吗?考虑到间接调用、动态调度、反射和不可判定性问题,我认为这在一般情况下是不可能的。最好的选择可能是静态分析工具(例如在 IDE 中用于检测调用图或用于混淆器)。
  • 您可能会发现我的回答在这里很有帮助:stackoverflow.com/a/51886800/1270000 我的回答确实谈到了在编译时使用它,但您可以在运行时轻松找到此信息。还可以考虑切换到 Java9 或更高版本,您可以使用堆栈遍历 api 来查找此信息:stackoverflow.com/questions/421280/…

标签: java reflection


【解决方案1】:

你可以使用

Thread.currentThread().getStackTrace()

也许这不是最好的方法,因为您必须深入挖掘返回的 StackTraceElement 数组。

【讨论】:

  • 在您的示例中,您必须将该代码放入 methodA1
  • 我的理解是,我只能在调用方法本身时才能做到这一点。我希望能够检查一个类并检查它是否(至少可能)在调用时调用一个方法,而不是线程是否调用了该方法。
  • 现在我明白了...您在构建时询问...我在运行时阅读。我很确定你的帖子是在运行时说的。
猜你喜欢
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2012-07-29
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多