簡體   English   中英

如何檢測 Java 中的方法調用?

[英]How can I detect a method call in Java?

不確定這是否應該在 StackOverflow 或不同的 StackExchange 站點中,所以如果我把它放在錯誤的地方,請原諒我!

我目前正在開發一個運行發送給它的代碼的系統。 有什么方法可以使用 static 分析工具來確定是否調用了Runtime.getRuntime().exec() 我知道 PMD 和事物存在,但我不知道如何在這個例子中使用它們。

我知道我可以使用 Java 安全管理器,但這不是我所追求的,因為我實際上只是獲取代碼,將其放入文件中,在其上運行 javac 然后運行它。

我也知道我可以為那個確切的字符串做一些正則表達式,但Runtime.getRuntime()可能存儲在不同的變量中。

謝謝!

一種可能的方法是為運行時 class 編寫包裝器並覆蓋所有 exec 函數,您可以記錄並調用超級 function 或放棄調用。

在源代碼中,您可以在執行之前將 Java Runtime 的導入替換為您的包裝器 class。

另一種可能性是獲取所有當前線程並檢查堆棧跟蹤。 您必須創建一個觀察者線程來不斷檢查方法調用,盡管......

public static void foo(){ 
        Thread.currentThread();
        Map<Thread,StackTraceElement[]> allLiveThreads = Thread.getAllStackTraces(); 
        Set<Entry<Thread,StackTraceElement[]>>  entries = allLiveThreads.entrySet();

        for(Entry<Thread,StackTraceElement[]> entry : entries){

            System.out.print("Thread: '"+ entry.getKey().getName()+"'");

            if(entry.getValue().length>1) {
                String nameofMethod = entry.getValue()[1].getMethodName(); 
                System.out.println(" and method name '"+ nameofMethod+"()'");
            }
            else {
                System.out.println(" with no methods.");
            }
        }
    }

暫無
暫無

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

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