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
引用,但我不知道这对这种特定情况是否重要。
所以最近我一直在尝试简单地更改一个 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
引用,但我不知道这对这种特定情况是否重要。