我正在努力理解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 = new ClassReader("java.lang.Runnable");.
我建议创建一个具有各种结构的测试类,并将其用作测试主题。
或者使用2.2.3中的示例来生成数据——最后一行生成字节数组。