大作业实验要求

更新记录

更新时间

更新内容

7.2

增加了关于TestUtil的说明

7.2

修改了实验要求,根据目前提供的框架修正了一些之前的描述不完整的地方

7.2

将学术诚信的部分移至大作业评分标准

实验要求

将2-6次lab的内容进行整合,完成从读文件到执行指令序列的完整过程,并通过测试。

你可以在提供的框架上进行魔改,修改已有类的内部实现以及增加新的包新的类,但是因为平台技术原因请谨记以下巨坑。

不要修改已有类名!!!不要修改已有类名!!!不要修改已有类名!!!

不要改动已有的包结构!!!不要改动已有的包结构!!!不要改动已有的包结构!!!

不要删除已有类!!!不要删除已有类!!!不要删除已有类!!!

实验输入

通过调用测试接口runTest来执行不同的class文件,mainClassName是全限定名,使用了.作为分隔符而不是/,而cp则是用户classpath

此接口的行为类似于java -cp [cp] [mainClassName]

任何情况下都不要改动这个接口,包括不要在此方法声明中抛出checked Exception,请自己在实现中解决。

public static void runTest(String mainClassName, String cp)

实验输出

打印输出结果,实验输出中都包含了hack TestUtil的内容,具体要求请查看关于TestUtil

我们提供的支持

class文件解析以及到JClass的转换,其余全部自行完成

之前作业中没有出现但是会涉及的内容

不会涉及内容

数组相关指令

字符串常量池

对类、对象的成员相关指令

库函数调用

加载数组类

本地方法调用

异常处理

更多具体设计的指令参考大作业测试用例涉及指令

其他注意事项

  1. 尽量保留你开发过程中的一些中间产出,例如你的草稿、你记录设计的笔记。

  2. 使用git来进行版本控制,每完成一部分就提交一下。

  3. 评分规则参见《评分规则》文档

关于TestUtil

TestUtil需要大家在invokestatic中hack如下三个方法,具体操作和lab6类似。

TestUtil.reach(int x)

把参数的值打印出来并换行,效果类似于下面这段代码。

public static void reach(int x){
System.out.println(x);
}

TestUtil.equalInt(int a, int b)

如果参数a和b相等,则返回true,否则抛出异常,其中异常的信息为"[参数1]!=[参数2]"

效果类似于下面这段代码

public static boolean equalInt(int a, int b) {
if(a==b){
return true;
}else{
throw new RuntimeException(a+"!="+b);
}
}

TestUtil.equalFloat(float a, float b)

效果&规则与 equalInt 类似,只是参数类型为float

尽管我们希望避免无聊的规格化输出,但由于技术原因我们还是不得不作出一些约定。

  1. 请注意一次reach要且仅要打印一个换行符

  2. equal的输出中,!=的两侧注意不要加空格