如何检测 Java 中的方法调用?

How can I detect a method call in Java?

不确定这是否应该在 Whosebug 或其他 StackExchange 站点中,所以如果我把它放在错误的地方,请原谅我!

我目前正在开发一个运行发送给它的代码的系统。有什么方法可以使用静态分析工具来查明是否调用了 Runtime.getRuntime().exec()?我知道 PMD 和其他东西存在,但我不知道如何在这个例子中使用它们。

我知道我可以使用 Java 安全管理器,但这不是我想要的,因为我实际上只是获取代码,将其放入文件中,运行 javac on它然后 运行 它。

我也知道我可以为那个确切的字符串做一些正则表达式的事情,但是 Runtime.getRuntime() 可能存储在不同的变量中。

谢谢!

一种可能的方法是为运行时编写包装器 class 并覆盖所有 exec 函数,您可以记录并调用超级函数或放弃调用。

在源代码中,您可以在执行之前用包装器 class 替换 Java 运行时的导入。

另一种可能是获取所有当前线程并检查堆栈跟踪。你有点必须创建一个不断检查方法调用的观察者线程,但是...

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.");
            }
        }
    }