【问题标题】:code to get all callers of a method of a Groovy-Java project获取 Groovy-Java 项目方法的所有调用者的代码
【发布时间】:2019-12-23 15:48:23
【问题描述】:

我正在寻找一种方法来从单独的主程序中提取所有调用printc(String) 方法的方法。

在 IntelliJ IDE 中,我可以通过转到方法 void printc(String txt) 并单击 Ctrl+Alt+H 来获得预期结果,如下所示:

)

但我想在我自己的程序中实现这样的功能 (不使用 IDE)

例如:

package com.controller;


import com.mgr.ServiceBean;
import com.ser.B;
**//Java file**
public class A extends ServiceBean {
    void a() {
    }

    void a1() {
    super.printc("calle of c");
    }

    void a2(B boo) {
        super.printc("calle of c");
    }


}

======

package com.ser

import com.mgr.C
import com.mgr.ServiceBean
**//Groovy file**
public class B extends ServiceBean {
    void b1() {
    }

    void b2() {
        super.printc("calle of c")
    }
}

=====

package com.mgr
**//Groovy file**
trait C
{
    String test() {
        return "test"
    }

    boolean printc(String methodName)  {
        if(methodName!=null)
            return true
        false
    }
}
=========
package com.mgr
**//Groovy file**
class ServiceBean implements C {

}

============

//Need logic which accepts 
class Main{
    public static void main(String args[]){
        Main m=new Main();
        m.FindUsage("C","void printc(String)")
    }
    Collection FindUsage(String ClassName, String methodname){
        // XXX Logic missing
        return **“[A.a1(),A.a2(Integer),B.b2()]”**
    }
}

注意:我不能使用堆栈跟踪来获取结果,因为 A、B、C 类是完全不同的 src,我没有运行它们,主要是一个单独的程序。

How can I find all the methods that call a given method in Java? --> 不包括 Groovy 类的调用者

【问题讨论】:

  • 看看这个,我相信这回答了你的问题。 stackoverflow.com/questions/2650844/…
  • 正如我所提到的,我正在寻找一个单独的主程序。我不能使用 StackTrace,因为它不在同一个程序中,而且我没有运行 A、B、C 类。
  • 所以你只想要一个代码分析器?您是否检查过 codenarc 是否可以帮助您?

标签: java intellij-idea groovy code-analysis static-code-analysis


【解决方案1】:

我想你找一个find使用功能,看看这个,它可以帮助你 https://www.jetbrains.com/help/idea/find-usages-method-options.html

【讨论】:

【解决方案2】:

如果可能出现在所需调用层次结构中的所有类在运行时都可用,那么您可以遍历每个类及其方法并创建一个拓扑排序图,您可以从中遍历调用层次结构,从相关的方法。

【讨论】:

    【解决方案3】:

    How can I find all the methods that call a given method in Java? 提供用于字节码扫描的代码,但它无法用于 Groovy 文件,我最终将源代码中的每一行作为字符串读取,然后将它们与 ASM 字节码分析一起解析以提取所需的java文件信息。 注意:ASM 不适用于 groovy 文件,因为 java 文件和 groovy 文件的字节码不同,在 Groovy 文件中你会得到一个比 java 更大的 .class 文件

    示例代码:

    //stringValue =entire text
    //charopen example: { or (
    //char close: } or )
    private String getFullMethod(String stringValue, String chartOpen, String charClose) {
            String methodName = ''
            int breaceStackIn = 0
            boolean read = true, readOpen = true
            if (stringValue != null) {
                stringValue.eachWithIndex { it, index ->
                    if (it.equalsIgnoreCase(chartOpen) && readOpen) {
                        breaceStackIn += 1
                        read = true
                    } else if (it.equalsIgnoreCase(charClose) && readOpen) {
                        breaceStackIn -= 1
                        methodName += charClose
                        read = false
                    }
                    if (read && readOpen) {
                        methodName += it
                    }
                    if (breaceStackIn == 0 && read == false && readOpen) {
                        readOpen = false
                    }
                }
            }
            methodName
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 2011-07-12
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多