我正在研究需要有关方法调用的副作用信息的Java程序。对于标准库类,我想编译一个包含只读参数的方法列表。也就是说,不修改其参数的方法,或者从其参数可以访问的任何方法。我可以从javadocs中推断出很多,但这需要时间。
是否有人可以建议更简单的参考或方法来确定标准方法调用是否修改其参数?阅读每个javadoc条目真的是最好的方法吗?
谢谢!
编辑: 奖励将是识别对对象没有副作用的方法。例如,stack.pop()会,而stack.size()则不会。
答案 0 :(得分:1)
好吧,所有只采用原始类型/字符串/对象/泛型类型作为参数的方法应该让你满意而不需要进一步考虑。对于java.lang和java.util,这应该涵盖大多数方法。
但是你最好限制你想要处理的包,因为标准的jdk为所有任务和目的提供了庞大的类库。
修改强>
声明为E extends ModifiableObject
的泛型类型有点模糊,所以请亲自看看。
答案 1 :(得分:1)
您可以尝试针对JDK的源代码运行类型推理引擎。
也许论文Type qualifier inference for Java可能有用。 (虽然全文似乎不在线)
答案 2 :(得分:1)
我们的DMS Software Reengineering Toolkit是一个通用的可自定义程序分析和转换工具。它有一个Java Front End来解析Java并生成符号表,类继承关系,控制和数据流信息。
根据此信息,可以计算关于方法M是直接修改参数还是从参数可到达的任何内容的本地信息。可以构造一个调用图,以及由M直接或间接调用的方法X修改的任何内容。这实际上就是你的答案。您必须将此应用于感兴趣的代码源,在您的情况下,Java标准库。
即使提供了所有提供的信息,配置DMS也不是一件容易的事。 OTOH,这个答案将非常准确(模数保守的假设和反思),可重复,并且易于应用于您选择的任何方法。通过Javadocs手动执行此操作可能非常耗时且容易出错。