gpt4 book ai didi

java - 生成代码属性时遇到问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:54 24 4
gpt4 key购买 nike

我正在尝试生成一个名为 hello 的方法,该方法使用动态字节码生成返回值 2。这是我当前的代码。生成方法。

    dout.writeShort(Modifier.PUBLIC);//class modifier
dout.writeShort(classConstant("test"));//class name
dout.writeShort(classConstant(Object.class.getName()));//superclass
dout.writeShort(0);//interface count
dout.writeShort(0);//field count
dout.writeShort(1);//method count
dout.writeShort(Modifier.PUBLIC|Modifier.STATIC);//modifiers
dout.writeShort(utfConstant("test"));//name
dout.writeShort(utfConstant(methodDescriptor(int.class, new Class[]{})));//descriptor
dout.writeShort(1);//attribute count
dout.writeShort(utfConstant("Code"));//attribute name
dout.writeInt(34);//attribute length
dout.writeShort(1);//max stack
dout.writeShort(0);//max locals
dout.writeInt(2);//code length
dout.writeByte(0x05);//iconst_2 opcode
dout.writeByte(0xAC);//ireturn opcode
dout.writeShort(0);//exception count
dout.writeShort(0);//attribute count
dout.writeShort(0);//class attributes

问题是,当我运行此代码时,我收到此异常

Exception in thread "main" java.lang.ClassFormatError: Invalid method Code length 0 in class file test
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at Bytecode.BytecodeTest$BytecodeClassLoader.buildClass(BytecodeTest.java:229)
at Bytecode.BytecodeTest.makeClass(BytecodeTest.java:42)
at Bytecode.BytecodeTest.buildClass(BytecodeTest.java:27)
at Bytecode.BytecodeTest.main(BytecodeTest.java:19)

奇怪的是,我将代码长度设置为大于 0,我将其设置为 2。我回顾了 oracle 规范,但它看起来仍然是正确的。我有一种感觉,我将一些数据写入了错误的类型,但我仍然找不到问题。

最佳答案

Hotspot validator 的一个未记录的功能是,对于 <= 45.2 的版本,它对代码属性中的某些字段使用较短的字段长度。这就是为什么将版本更改为 49 解决了所有问题。

如果您使用 Krakatau,它会自动处理这个问题,但我还没有看到任何其他工具可以处理这种情况。

幸运的是,Java 的第一个稳定公共(public)版本是 45.3,因此您不太可能在野外看到这样的合法代码。但这是挫败逆向工程师的巧妙技巧。

关于java - 生成代码属性时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17278318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com