Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何复制InsnList_Java_Java Bytecode Asm_Jvm Bytecode - Fatal编程技术网

Java 如何复制InsnList

Java 如何复制InsnList,java,java-bytecode-asm,jvm-bytecode,Java,Java Bytecode Asm,Jvm Bytecode,InsnList没有复制自我的方法 我尝试迭代列表并将每个节点添加到新列表中。但列表的迭代副本执行npe 私有静态InsnList副本(InsnList InsnList){ InsnList r=新InsnList(); 对于(int i=0;i

InsnList没有复制自我的方法

我尝试迭代列表并将每个节点添加到新列表中。但列表的迭代副本执行npe

私有静态InsnList副本(InsnList InsnList){
InsnList r=新InsnList();
对于(int i=0;i
insnlistcopy=copy(someList);
对于(int i=0;i
我希望复制会是,但复制的迭代会产生以下错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at org.objectweb.asm.tree.InsnList.toArray(InsnList.java:199)
    at org.objectweb.asm.tree.InsnList.get(InsnList.java:110)

虽然我无法重现您的特定异常,但它似乎只是您的方法的根本问题的另一个症状。如各国所述:

表示字节码指令的节点。一条指令一次最多只能出现一次

因此,您不能复制一个
InsnList
,至少不能将相同的节点插入到另一个列表中。这也是
InsnList
add(InsnList)
insert(InsnList)
方法从源列表中删除节点的原因

当您确实需要
InsnList
的副本时,还必须创建节点对象的副本,这可以通过Visitor API轻松完成:

private static InsnList copy(InsnList insnList) {
    MethodNode mv = new MethodNode();
    insnList.accept(mv);
    return mv.instructions;
}

但只要任务允许,您就应该使用ASM的Visitor API将指令直接写入目标类文件,而不是创建指令列表的副本。另请参阅有关实际任务的信息。

InsnList
不是线程安全的。是否有可能其他线程正在更改列表?另外,为什么不使用
add(InsnList InsnList)
来代替呢?@KernelMode我的应用程序只有一个线程。add不相关,因为add后add clear list from参数我不会得到运行此代码的异常。你能分享完整的代码吗?有人建议我使用下面的代码,它可以正常工作,因为我想和访问者分享我的想法!