ASM Java bycode muniplation更改类名

时间:2016-10-18 18:41:48

标签: java bytecode java-bytecode-asm bytecode-manipulation

所以最近我一直在尝试简单地改变一个班级名称而我只是不能。 这是我的代码 InjectorClassNode https://0bin.net/paste/9REMNddwqjm8vRms#hyr4RG3BI36J+kRwMfC2pJoXb7I3+7AwKKzYhhXZQfw

MethodClassNode https://0bin.net/paste/UwKCvIG+cliZAYja#gILvBXxaQ1CyfQ602c6h7UE9dimhlo6q+GbKIwZ6m8B

现在,当我运行它时,它会抛出一个因某些原因而找不到的课程" com / kirelcodes / cool / Task"在导入列表中,我不知道为什么 我很想得到帮助

2 个答案:

答案 0 :(得分:1)

所有signature方法的visit…参数都是指通用签名,它仅在运行时与Reflection相关。你应该注意到,类访问方法有一个name参数,它与类的名称更相关,这是你想要改变的。

对于成员来说,desc参数不是JVM规范所称的“ signature ”并不是那么明显,但至少ASM API在调用通用签名描述参数signature。这就是为什么signature可以是null,这表明不涉及泛型类型。对于您想要实现的目标,您必须调整desc参数。

此外,请注意,在处理说明时,您不仅需要关心转换所引用成员的所有者类型,还必须调整成员的类型。顺便说一下,在这个上下文中命名参数arg0, arg1, arg2, arg3, arg4没有帮助。可能存在您未处理的其他类型引用,例如ldc指令可以推送Class引用,但我不知道这是否对此特定情况有用。

答案 1 :(得分:0)

在您的解决方案中,您只能在一个文件中重命名该类。其他类将不会收到名称更改的通知,并将抛出“ClassNotFoundException”。

在使用Remapper完成修改后重命名该类会更好。