【问题标题】:Writing fields to bytecode not working将字段写入字节码不起作用
【发布时间】:2013-05-29 21:10:59
【问题描述】:

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

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

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

线程“主”java.lang.ClassFormatError 中的异常:类测试中的非法字段修饰符:0x1 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:791) 在 java.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('.', '/');
}

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

【问题讨论】:

    标签: java field bytecode dynamic-programming


    【解决方案1】:

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

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

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

    dout.writeShort(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2019-03-28
      • 1970-01-01
      • 2014-02-07
      • 2015-10-04
      相关资源
      最近更新 更多