【问题标题】:Find all calls to method in java classes查找java类中的所有方法调用
【发布时间】:2013-06-04 12:30:47
【问题描述】:

我有一个包含许多课程的大型项目。我有一个非常具体的课程;让我们将其命名为SuperFoo。我需要找到对方法equals() 的所有调用,参数类型为Superfoo。希望清楚。

所以,再来一次……在数千个 java 文件(或字节码?)中,我想找到对方法 java.lang.Object.equals(Object arg) 的所有调用,但此调用的参数必须是 SuperFoo 类型。例如:

public void doItWith(SuperFoo foo) {
    if (otherFoo.equals(foo)){
         // do something
    }
...
}

我在 Eclipse 中检查了按查询浏览、分析字节码和 Java 搜索,但我认为这些都不起作用。

【问题讨论】:

  • depfind.sourceforge.net/Manual.html 可能会有所帮助。
  • 快速而肮脏的答案;更改方法签名并观察您的 IDE 显示所有错误。
  • @GilbertLeBlanc 那行不通。编译器将改为调用 Object.equals

标签: java eclipse methods reference


【解决方案1】:

编程方法是使用Aspect Oriented Programming(即AspectJ)。您将定义一个切入点来捕获感兴趣的方法调用

pointcut equals(Superfoo o) = call(boolean *.equals(Object)) && args(o);

然后使用建议来选择每个匹配项并查询连接点对象以获取静态信息,即它出现在代码中的位置。

before(Superfoo o) : equals(o) {
  System.out.println("An occurence at "+thisJoinPoint.getSourceLocation());
}

【讨论】:

  • 使用编译时编织,是否有可能在运行前找出所有的连接点?
  • 这可能有更好的方法 - 但如果您在 Eclipse 中使用 AspectJ,您可以向它询问连接点匹配的所有位置。
  • 我检查了一下,这个切入点匹配所有对“equals”方法的调用(不仅是 SuperFoo 类型的参数):(有什么想法吗?
【解决方案2】:

所以,您正在尝试找出

的引用
public boolean equals(Object o) 

在 SuperFoo 中被覆盖。如果您可以访问源代码,这可以在 eclipse 中完成。如果您选择 Call Hierarchy,eclipse 会返回所有出现的 Object 的 equals() 方法。因此,您需要尝试以下方法:

打开 SuperFoor。选择等号方法。右键点击。参考——> 项目。在生成的搜索窗口中,在最右侧,单击三角形。选择“要覆盖的引用”。而已。最初返回的结果将被过滤,它将大部分包含在 SuperFoo 中覆盖的等号引用。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2010-10-30
    • 2020-02-22
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多