为什么在加载使用 ASM 创建的 class 文件时会出现幻值错误?

Why do I get a magic value error when loading a class file created with ASM?

我使用以下代码将使用 ASM 创建的 byte 数组写入文件:

try(FileOutputStream stream = new FileOutputStream(classname + ".class")) {
        stream.write(res);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

使用以下代码加载文件:

@Override
public Class<?> findClass(String name) {
    for(URL url : getURLs()) {
        File file = new File(url.getPath().substring(1) + name + ".class");
        if(file.exists()) {
            try {
                System.out.println("found class");
                byte[] bytes = IOUtils.toByteArray(new FileReader(file));
                return super.defineClass(name, bytes, 0, bytes.length);             
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return null;
}

我的 ClassLoader 找到了 class,但我得到了一个 ClassFormatError 魔法值是 4022320623。

这种行为的原因是什么?

问题似乎出在读取文件的方式上(使用 Apache 的 Commons IO 库)。使用以下命令读取文件效果很好:

byte[] bytes = Files.readAllBytes(file.toPath());