1

我正在用字节码编写一个类,但我对如何向类添加字段感到困惑。我试过添加这样的字段

dout.writeShort(1);
dout.writeShort(Modifier.PUBLIC);
dout.writeShort(stringConstant("hdhd"));
dout.writeShort(stringConstant(classCode(int.class)));

但是当我尝试加载生成的类时,我得到一个

线程“主”java.lang.ClassFormatError 中的异常:类测试中的非法字段修饰符:java.lang.ClassLoader.defineClass1(Native Method)处的 java.lang.ClassLoader.defineClass(ClassLoader.java:791)处的 0x1。 lang.ClassLoader.defineClass(ClassLoader.java:634) 在 BytecodeTest$InterfaceClassLoader.buildInterface(BytecodeTest.java:139) 在 BytecodeTest.main(BytecodeTest.java:25)

我还应该提到我正在尝试构建的类是一个接口。

我看不出 public 修饰符有什么无效的。

这是我的 classCode 方法

private static String classCode(Class<?> c) 
{
    if (c == void.class)
        return "V";
    Class<?> arrayClass = Array.newInstance(c, 0).getClass();
    return arrayClass.getName().substring(1).replace('.', '/');
}

我的问题是接口需要最终字段,而我没有将字段设为最终字段。

4

1 回答 1

2

因为它说你有非法的字段标志,你应该检查 JVM 规范中关于字段标志的部分。如果你有,你会看到

接口的所有字段都必须设置其 ACC_PUBLIC、ACC_STATIC 和 ACC_FINAL 标志;他们可能设置了 ACC_SYNTHETIC 标志,并且不得设置表 4.19 中的任何其他标志

所以解决方案是做这样的事情(不确定你正在使用的库的确切语法)。

dout.writeShort(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL);
于 2013-05-30T03:33:50.643 回答