首页 > 解决方案 > 如何检测 Java 中的方法调用?

问题描述

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

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

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

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

谢谢!

标签: javastatic-analysis

解决方案


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

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

推荐阅读