Java 如何复制InsnList
InsnList没有复制自我的方法 我尝试迭代列表并将每个节点添加到新列表中。但列表的迭代副本执行npeJava 如何复制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副本(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参数我不会得到运行此代码的异常。你能分享完整的代码吗?有人建议我使用下面的代码,它可以正常工作,因为我想和访问者分享我的想法!