> For the complete documentation index, see [llms.txt](https://minguw.gitbook.io/jvm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://minguw.gitbook.io/jvm/jvm-framework/final.md).

# 大作业实验要求

## 更新记录

| 更新时间 | 更新内容                              |
| ---- | --------------------------------- |
| 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的转换，其余全部自行完成

| 之前作业中没有出现但是会涉及的内容 | 不会涉及内容 |
| ----------------- | ------ |
| 数组相关指令            | 字符串常量池 |
| 对类、对象的成员相关指令      | 库函数调用  |
| 加载数组类             | 本地方法调用 |
|                   | 异常处理   |

更多具体设计的指令参考[大作业测试用例涉及指令](/jvm/jvm-framework/good-luck.md)

## **其他**注意事项

1. 尽量保留你开发过程中的一些中间产出，例如你的草稿、你记录设计的笔记。
2. 使用git来进行版本控制，每完成一部分就提交一下。
3. 评分规则参见《评分规则》文档

## 关于TestUtil

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

#### TestUtil.reach(int x)

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

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

#### TestUtil.equalInt(int a, int b)

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

效果类似于下面这段代码

```java
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

{% hint style="danger" %}
尽管我们希望避免无聊的规格化输出，但由于技术原因我们还是不得不作出一些约定。

1. 请注意一次reach要且仅要打印一个换行符
2. equal的输出中，`!=`的两侧注意不要加空格
   {% endhint %}
