我正在使用dirtyJOE来编辑类文件的方法。
原始类文件有一些加密方法调用等。我已经改变了方法 ldc (byte-code: 12 1E) 的字节码来加载 true 和 return(byte-code: 12 1E)
显然,Java 的验证器对我的更改感到不满,并抱怨验证错误:
java.lang.VerifyError: 在方法[methodName]中的偏移量 2 at.. at.. 中需要堆栈映射帧
我想知道是否有办法让 jvm 认为存在堆栈映射帧?
谢谢
我正在使用dirtyJOE来编辑类文件的方法。
原始类文件有一些加密方法调用等。我已经改变了方法 ldc (byte-code: 12 1E) 的字节码来加载 true 和 return(byte-code: 12 1E)
显然,Java 的验证器对我的更改感到不满,并抱怨验证错误:
java.lang.VerifyError: 在方法[methodName]中的偏移量 2 at.. at.. 中需要堆栈映射帧
我想知道是否有办法让 jvm 认为存在堆栈映射帧?
谢谢
如果原始类没有使用 StackMapTables,那么应该没有问题,假设您正确修改了字节码。即使它正在使用它们,通常也可以删除它们并恢复到旧的行为。假设该类不使用invokedynamic,您可以将版本改回49.0并删除 StackMapTable 属性。
不幸的是,51.0 版要求使用 StackMapTable,在手动编辑字节码时创建它很痛苦。如果您的类实际上正在使用 51.0 功能(即invokedynamic),那么您唯一的选择就是创建适当的堆栈帧。在像这样的简单情况下,您可以手动完成,但通常最好使用工具自动生成堆栈帧。