簡體   English   中英

獲取 Groovy-Java 項目方法的所有調用者的代碼

[英]code to get all callers of a method of a Groovy-Java project

我正在尋找一種方法來從單獨的主程序中提取所有調用printc(String)方法的方法。

在 IntelliJ IDE 中,我可以轉到方法void printc(String txt)並單擊Ctrl+Alt+H以獲得如下預期結果:

給定方法的調用者]([Groovy-java 項目 )

但我想在我自己的程序中實現這樣的功能(不使用 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,我沒有運行它們,main 是一個單獨的程序。

如何在 Java 中找到調用給定方法的所有方法? --> 不包括 Groovy 類的調用者

我覺得你找個find使用功能,看看這個,可以幫到你https://www.jetbrains.com/help/idea/find-usages-method-options.html

如果可能出現在所需調用層次結構中的所有類在運行時都可用,那么您可以遍歷每個類及其方法並創建一個拓撲排序圖,從中您可以從相關方法遍歷調用層次結構.

如何在 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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM