Java/ASM:即使列表有1024个元素长,索引0也超出了长度0的范围



我正在努力理解ASM,我目前卡在手册中的第2.2.4章。这应该是一个简单的Java问题。

我试图理解的示例代码中有这一行称为byte[] b1 = ...;。因为这不是一个完整的陈述(我甚至尝试过!)我把它换成了byte[] b1 = new byte[1024];

当我编译时,我得到这个奇怪的错误信息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

后三行调用(classReader.accept(classWriter, 0);)。下面是完整的代码和完整的错误信息:

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
public class ModifyClassExample {
public static void main(String[] args) {
byte[] b1 = new byte[1024];
ClassWriter classWriter = new ClassWriter(0);
ClassReader classReader = new ClassReader(b1);
classReader.accept(classWriter, 0);
byte[] b2 = classWriter.toByteArray();
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at org.objectweb.asm.ClassReader.readStringish(ClassReader.java:3726)
at org.objectweb.asm.ClassReader.readClass(ClassReader.java:3741)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:454)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
at ModifyClassExample.main(ModifyClassExample.java:9)
Process finished with exit code 1

我尝试减小字节数组的大小。这就是为什么我知道这个错误弹出的数组长度为14+。

不用说,我需要更多的

您没有在字节数组b1中提供任何类数据,因此它将不起作用。但是,您可以从标准java类(如

)构造ClassReader。
ClassReader classReader = new ClassReader("java.lang.Runnable");. 

我建议创建一个具有各种结构的测试类,并将其用作测试主题。

或者使用2.2.3中的示例来生成数据——最后一行生成字节数组。

最新更新