Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字段写入字节码不起作用_Java_Field_Bytecode_Dynamic Programming - Fatal编程技术网

Java 将字段写入字节码不起作用

Java 将字段写入字节码不起作用,java,field,bytecode,dynamic-programming,Java,Field,Bytecode,Dynamic Programming,我正在用字节码编写一个类,但我对如何向类中添加字段感到困惑。我尝试过添加这样的字段 dout.writeShort(1); dout.writeShort(Modifier.PUBLIC); dout.writeShort(stringConstant("hdhd")); dout.writeShort(stringConstant(classCode(int.class))); 但是当我尝试加载结果类时,我得到一个 线程“main”java.lang.ClassFormatError中出现异

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

dout.writeShort(1);
dout.writeShort(Modifier.PUBLIC);
dout.writeShort(stringConstant("hdhd"));
dout.writeShort(stringConstant(classCode(int.class)));
但是当我尝试加载结果类时,我得到一个

线程“main”java.lang.ClassFormatError中出现异常:类测试中的字段修饰符非法:0x1 位于java.lang.ClassLoader.defineClass1(本机方法) 位于java.lang.ClassLoader.defineClass(ClassLoader.java:791) 位于java.lang.ClassLoader.defineClass(ClassLoader.java:634) 字节码测试$InterfaceClassLoader.buildInterface(BytecodeTest.java:139) 位于BytecodeTest.main(BytecodeTest.java:25)

我还应该提到,我试图构建的类是一个接口

我看不出公共修饰符有什么是无效的

这是我的类代码方法

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('.', '/');
}
私有静态字符串类代码(c类)
{
if(c==void.class)
返回“V”;
类arrayClass=Array.newInstance(c,0.getClass();
返回arrayClass.getName().substring(1).replace('.','/');
}


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

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

接口的所有字段必须具有ACC_公共、ACC_静态和 设置ACC_最终标志;他们可以设置ACC_合成标志,并 不得设置表4.19中的任何其他标志

因此,解决方案是这样做(不确定您正在使用的库的确切语法)

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