Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 ClassFormatError:类中的字段“\u callee\u a1”具有非法签名“\u callee”_Java_Java Bytecode Asm_Bytecode Manipulation - Fatal编程技术网

Java ClassFormatError:类中的字段“\u callee\u a1”具有非法签名“\u callee”

Java ClassFormatError:类中的字段“\u callee\u a1”具有非法签名“\u callee”,java,java-bytecode-asm,bytecode-manipulation,Java,Java Bytecode Asm,Bytecode Manipulation,尝试内联两个类时出现一些异常: public class CI_Caller1 { private int _data; private CI_Callee_2 _callee; public CI_Caller1(int data, CI_Callee_2 callee){ _data = data; _callee = callee; } } public class CI_Callee_2 { private I

尝试内联两个类时出现一些异常:

public class CI_Caller1 {
    private int _data;
    private CI_Callee_2 _callee;

    public CI_Caller1(int data, CI_Callee_2 callee){
        _data = data;
        _callee = callee;
    }
}

public class CI_Callee_2 {

    private Integer _a1;
    private String _t;

    public CI_Callee_2(Integer a1, String t){
        _a1 = a1;
        _t = t;
    }
}
内联操作是内联两个字段,即CI_Callee_2中的_a和_t,作为CI_Caller1的成员。新成员将是:

private int _data;
private Integer _callee__a1;
private String _callee__t;
一切似乎都是正确的,但当我尝试加载生成的字节[]时,异常被抛出为:

java.lang.ClassFormatError: Field "_callee__a1" in class <Unknown> has illegal signature "_callee"
    at sun.misc.Unsafe.defineAnonymousClass(Native Method)
    at code.jit.asm.services.ACLoader.loadClass(ACLoader.java:27)
此处的_fieldNode引用CI_被调用方_2的字段及其原始成员和值:

desc: Ljava/lang/Integer;
name: _a1     //calculateName will map _a1 to _callee_a1
signature: null
value: null
一旦使用CI_Callee_2的ClassNode初始化了_fieldNode,我就没有对它进行任何更改。_fieldNode的签名值始终保持为空


有人看到过这个例外吗?谢谢

您创建的名为_callee_uA1的字段具有签名_callee。字符u不是字段签名的有效开头。您说希望类型为整数,因此字段签名应为Ljava/lang/Integer;。L表示这是一个仍然混淆的参考类型。1我无法理解生成的代码中为什么会有签名_callee,因为_fieldNode.signature for visitField为NULL,并且它是用CI_callee2的classNode初始化的永不更改。2签名和描述有什么区别?Ljava/lang/Integer;是描述,它已经作为desc正确地传递给cw.visitField。我已经修复了它。问题出在另一个地方,我将错误的字符串“\u callee”作为putField指令的desc。@shijie xu:ASM API使用的名称有点误导。desc是别处称为签名的内容,而签名是可能为空的通用签名。ASM使用术语desc和签名的方式与JVM规范相同:
desc: Ljava/lang/Integer;
name: _a1     //calculateName will map _a1 to _callee_a1
signature: null
value: null