为什么在加载使用 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());
我使用以下代码将使用 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());