首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中检测方法调用?

如何在Java中检测方法调用?
EN

Stack Overflow用户
提问于 2019-10-14 00:50:11
回答 2查看 186关注 0票数 1

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

我目前正在开发一个系统,它可以运行发送给它的代码。有没有办法我可以使用静态分析工具来找出,比如说,是否调用了Runtime.getRuntime().exec()?我知道PMD之类的东西是存在的,但我不知道如何在这个示例中使用它们。

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

我还知道我可以对该字符串执行正则表达式之类的操作,但是Runtime.getRuntime()可能存储在不同的变量中。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-15 15:48:57

另一种可能是获取所有当前线程并检查堆栈跟踪。不过,您需要创建一个观察者线程来不断地检查方法调用。

代码语言:javascript
复制
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.");
            }
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2019-10-14 03:45:20

一种可能的方法是为Runtime类编写一个包装器,并覆盖所有的exec函数,您可以记录并调用超级函数或删除调用。

在源代码中,您可以在执行Java Runtime之前将其导入替换为包装器类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58365729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档