加载使用ASM创建的类文件时,为什么会出现魔术值错误?

时间:2016-10-06 18:01:49

标签: java bytecode

我使用以下代码将使用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找到,但是我得到一个ClassFormatError,其魔法值是4022320623。

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

问题似乎是文件的读取方式(使用Apache的Commons IO库)。使用以下内容读取文件可以正常工作:

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