首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别返回的对象是否是在方法执行期间创建的- Java

如何识别返回的对象是否是在方法执行期间创建的- Java
EN

Stack Overflow用户
提问于 2010-07-03 08:36:50
回答 5查看 151关注 0票数 1

原始问题:给定一个方法,我想确定返回的对象是否在该方法的执行过程中创建。我可以或应该使用什么类型的静态分析?

修改过的问题:给定一个方法,我想确定在该方法中创建的对象是否可以由该方法返回。因此,如果我遍历并将该方法中返回类型的所有实例化添加到一个set中,是否有一个分析可以告诉我,对于set中的每个成员,它是否可以返回。此外,是否有可能不将集合限制为单个方法,而是将原始方法调用的所有方法都限制为委托?

这并不是特定于任何调用的。

看起来方法逃逸分析可能是答案。

感谢大家的建议。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-04 00:14:29

你的问题看起来要么是一个简单的“到达”分析(“一个新值是否到达一个返回语句”),如果你对任何调用感兴趣,而且只有当一个方法本地的new创建了这个值。如果您需要知道任何调用是否可以从任何子计算返回新值,您需要计算可能的调用图,并确定任何被调用函数是否可以返回新值,或者将新值从被调用函数传递到其父函数。

有许多Java静态分析框架。

SOOT是一个基于字节码的分析框架。您可以使用下面的代码来实现静态查询。

DMS Software Reengineering Toolkit是用于构建自定义分析器和转换工具的通用引擎。它有一个完整的Java前端,并在源代码上计算各种有用的基础分析(定义/使用链,调用图)。它可以处理类文件,但目前只能获取类型信息。

如果您希望进行动态分析,无论是动态分析本身,还是作为加强静态分析的一种方式,都可以使用DMS通过插入代码来跟踪分配,从而以任意方式检测源代码。

票数 1
EN

Stack Overflow用户

发布于 2010-07-03 08:52:17

我不确定这是否适用于您的情况,但一种简单的方法是在对象的构造函数中填充一个新添加的'instantiatedTime‘字段,并将其与方法被调用的时间进行比较。这假设您有权访问相关对象的源。

票数 0
EN

Stack Overflow用户

发布于 2010-07-03 08:53:01

你确定静态分析是适合这项工作的工具吗?静态分析可以在某些情况下给出结果,但不是全部。

在调试器下运行JVM时,它会分配具有递增对象it的对象,您可以通过System.identityHashCode(Object o).获取这些对象it。您可以使用这一事实来构建一个测试用例,该测试用例创建一个对象(检查点),然后调用该方法。如果返回的对象的id大于检查点id,则知道该对象是在该方法中创建的。

免责声明:这是在Windows XP调试器下观察到的行为。

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

https://stackoverflow.com/questions/3169830

复制
相关文章

相似问题

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