assembly (已解决)Java/ASM:即使列表长度为1024个元素,索引0也超出长度0的界限

mv1qrgav  于 2022-12-19  发布在  Java
关注(0)|答案(1)|浏览(131)

编辑:这个问题实际上是非常ASM相关的,即使我最初不认为。我的问题已经解决了感谢用户"67af7af3 - 67f3 - 48bf-98c5-d9155c"(这实际上是他的名字)。我离开这个在线只是为了防止你犯同样的(愚蠢的)错误,我犯了。
我正在努力理解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+。
不用说,我需要的不止这些。

snvhrwxg

snvhrwxg1#

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

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

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

相关问题