ASM Java 字节码操作更改 class 名称

ASM Java bycode muniplation changing a class name

所以最近我一直在尝试简单地更改一个 class 名称,但我就是做不到。 这是我的代码 注入器类节点 https://0bin.net/paste/9REMNddwqjm8vRms#hyr4RG3BI36J+kRwMfC2pJoXb7I3+7AwKKzYhhXZQfw

方法类节点 https://0bin.net/paste/UwKCvIG+cliZAYja#gILvBXxaQ1CyfQ602c6h7UE9dimhlo6q+GbKIwZ6m8B

现在,当我 运行 它时,它抛出一个 class not found for some stuuped reason "com/kirelcodes/cool/Task" 在导入列表中,我不知道为什么 我很想得到帮助

在您的解决方案中,您只会在一个文件中重命名 class。其他 classes 将不会收到名称更改的通知,并且会抛出 "ClassNotFoundException"。

最好在使用 Remapper 完成修改后重命名 class。

所有visit…方法的signature参数引用通用签名,它只在运行时与反射相关。您应该已经注意到,class 访问方法有一个 name 参数,它与 class 的 name 更相关,它是你想改变什么。

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

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