如何使用Cofoja离线字节码编写器?

时间:2015-09-30 04:31:09

标签: java design-by-contract

我尝试使用Cofoja(Java合同)对我的代码进行离线检测。我似乎无法使用脱机字节码编写器获取已编译类文件中的契约(此功能在GitHub页面的Invocation部分中简要提及)。我执行生成的类文件,故意失败合同。什么都没发生。

这是我的Java代码......在我的主要内容中,我只需执行以下操作:return divide(10, 0);

  @Requires("y != 0")
  public static int divide(int x, int y)
  {
    return x / y;
  }

然后我执行以下操作:

我通过我的IDE,Intellij构建.java文件并获取类文件 然后像这样执行脱机字节码编写器:

java -Dcom.google.java.contract.classoutput=cofoja -cp cofoja.asm-1.2-20140817.jar com.google.java.contract.core.agent.PreMain JavaTest.class

这导致另一个" JavaTest.class"文件在" cofoja"中生成目录。但是,当我执行它时,我没有看到任何合同错误。

有没有人知道正确使用的步骤" com.google.java.contract.core.agent.PreMain"生成包含合同的类文件?

1 个答案:

答案 0 :(得分:1)

为了供将来参考,我去看了com.google.java.contract.core.agent.PreMain的源代码。事实证明,它希望合同文件和帮助文件与常规java类文件位于同一位置。一旦我将类文件与合同文件一起包含(在同一目录中),这就开始工作了 所以回顾一下:

java -d {output_dir} -cp {your_classpath} "-Acom.google.java.contract.classoutput={output_dir}" "-Acom.google.java.contract.classpath={your_classpath}" "-Acom.google.java.contract.sourcepath={your_sources_dir}" -processor com.google.java.contract.core.apt.AnnotationProcessor

编译java类和cofoja合同文件。确保类文件与cofoja合同文件位于同一目录中 然后执行:

java -Dcom.google.java.contract.classoutput={output_dir} -cp cofoja.asm-1.2-20140817.jar com.google.java.contract.core.agent.PreMain {all .class files separated by spaces}

此命令将生成单个.class文件,其中包含内置契约,然后您可以将其编译为jar文件。请注意,您需要将所有原始类文件的列表作为最后一个命令的参数,并确保合同文件和帮助文件位于相应的类文件旁边。