Java标准库中无副作用方法

7
我正在进行Java程序的分析,需要获取有关方法调用的副作用信息。对于标准库类,我想编译一个只读参数方法列表。也就是说,这些方法不修改它们的参数或任何与其参数相关联的内容。我可以从javadoc中推断出很多信息,但这需要时间。
是否有更简单的参考或方法来确定标准方法调用是否会修改它们的参数?阅读每个javadoc条目是否真的是最好的方法?
谢谢!
编辑: 额外的奖励是识别对对象没有副作用的方法。例如,stack.pop() 就是,而 stack.size() 不是。

1
我很想看看你的解决方案。你可以假设任何使用不可变类型的方法都是无副作用的。除了javadocs和代码之外,我不确定你还能依据什么。 - NG.
@SB:请记住,String是不可变的,但实现CharSequence接口的类可能是可变的。 - Powerlord
我想知道现在是否有关于这个的注释,但是找不到任何信息。 - Daniel Alder
3个回答

1

嗯,只接受原始类型/字符串/Object/泛型类型作为参数的所有方法都应该满足您的需求,无需进一步考虑。对于 java.lang 和 java.util,这应该涵盖大多数方法。

但是,您最好限制要处理的包,因为标准 JDK 为所有任务和目的提供了庞大的类库。

编辑
对于声明为 E extends ModifiableObject 的泛型类型,情况有些模糊,所以请自行查看。


1

你可以尝试对JDK的源代码运行类型推断引擎。

也许这篇论文Type qualifier inference for Java可能会有所帮助。(完整文本似乎不在线上)


1

我们的DMS软件重构工具包是一个通用的可定制的程序分析和转换工具。它有一个Java前端,可以解析Java并生成符号表、类继承关系、控制和数据流信息。

通过这些信息,可以计算出关于方法M是否直接修改参数或任何可从参数访问的内容的本地信息。可以构建调用图,并找出由M直接或间接调用的X方法修改的任何内容。这实际上就是你的答案。你需要将其应用到感兴趣的代码源中,例如Java标准库。

即使有所有提供的信息,配置DMS来完成这项任务也不是一件简单的事情。另一方面,这个答案会非常准确(除了保守的假设和反射),可重复,并且易于应用于您选择的任何方法。通过Javadocs手动完成这项任务可能非常耗时且容易出错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接