Java标准库中的无副作用方法

Java标准库中的无副作用方法,java,javadoc,static-analysis,Java,Javadoc,Static Analysis,我正在对Java程序进行分析,该程序需要关于方法调用的副作用信息。对于标准库类,我想编译一个带有只读参数的方法列表。也就是说,不修改其参数的方法,或者不修改任何可以从其参数访问的方法。我可以从javadocs中推断出很多,但这需要时间 有谁能建议一个更简单的参考或方法来确定标准方法调用是否修改了它们的参数?阅读每个javadoc条目真的是最好的方法吗 谢谢 编辑: 一个额外的好处是识别对对象也没有副作用的方法。例如,stack.pop()将满足您的要求,而stack.size()将不满足您的要求

我正在对Java程序进行分析,该程序需要关于方法调用的副作用信息。对于标准库类,我想编译一个带有只读参数的方法列表。也就是说,不修改其参数的方法,或者不修改任何可以从其参数访问的方法。我可以从javadocs中推断出很多,但这需要时间

有谁能建议一个更简单的参考或方法来确定标准方法调用是否修改了它们的参数?阅读每个javadoc条目真的是最好的方法吗

谢谢

编辑:
一个额外的好处是识别对对象也没有副作用的方法。例如,stack.pop()将满足您的要求,而stack.size()将不满足您的要求。

好吧,所有只将基元类型/字符串/对象/泛型类型作为参数的方法都应该满足您的要求,无需进一步考虑。对于java.lang和java.util,这应该涵盖大多数方法

但您最好限制要处理的包,因为标准jdk为所有任务和用途提供了巨大的类库

编辑

对于声明为
E extends ModifiableObject
的泛型类型来说,它有点模糊,所以请自己看看。

您可以尝试对JDK的源代码运行类型推理引擎

也许这张纸有用。(虽然全文似乎不在线)

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

根据这些信息,可以计算关于方法M是否直接修改参数或任何可从参数访问的内容的本地信息。一个调用图可以被构造,任何被方法X修改的东西都可以被M直接或间接调用。这就是你的答案。您必须将其应用于感兴趣的代码源,在您的例子中,Java标准库


即使提供了所有信息,配置DMS来实现这一点也不是件小事。OTOH,这个答案将非常准确(模保守假设和反射),可重复,并且易于应用于您选择的任何方法。通过Javadocs手动执行此操作可能非常耗时且容易出错。

我很想看看您的解决方案。您可以假设任何采用不可变类型的方法都没有副作用。不确定除了javadocs和code还有什么可以使用。@SB:请记住,
String
是不可变的,但是实现
CharSequence
的类可能是,也可能不是。