Java/ASM:索引0超出长度0的界限,即使列表长度为1024个元素

but5z9lq  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(215)

我正在努力理解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+。
不用说,我需要的不止这些。

xpszyzbs

xpszyzbs1#

您没有在字节数组b1中提供任何类数据,因此它不会工作。

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

我建议创建一个具有各种构造的测试类,并将其用作测试主题。
或者使用2.2.3中的示例生成数据-最后一行生成字节数组。

相关问题