ClassFormatError:类<unknown>中的字段“_callee__a1”具有非法签名“_callee”

时间:2015-07-05 03:05:44

标签: 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 Integer _a1;
    private String _t;

    public CI_Callee_2(Integer a1, String t){
        _a1 = a1;
        _t = t;
    }
}

inling操作是将CI_Callee_2中的两个字段_a和_t内联为CI_Caller1的成员。新成员将是:

private int _data;
private Integer _callee__a1;
private String _callee__t;

一切似乎都是正确的,但是当我尝试加载生成的byte []时,会抛出异常:

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)

vistiField的方式如下:

    _fieldNode = reference2CI_Callee_2FieldNode();
    //cw is class visitor to the CI_Caller1
    cw.visitField(_fieldNode.access, calculateName(fieldHoster, _fieldNode.name), 
            _fieldNode.desc, _fieldNode.signature, _fieldNode.value);

这里_fieldNode引用了CI_Callee_2的字段及其原始成员(及其值):

desc: Ljava/lang/Integer;
name: _a1     //calculateName will map _a1 to _callee_a1
signature: null
value: null

一旦使用CI_Callee_2的ClassNode进行了初始化,我就没有对_fieldNode进行任何更改。 (_fieldNode的signature值始终保持NULL)

有没有人见过这个例外?谢谢。

1 个答案:

答案 0 :(得分:0)

您使用名称&#34; _callee__a1&#34;创建的字段有签名_callee。字符_不是字段签名的有效开头。您说您希望类型为Integer,因此字段签名应为Ljava/lang/Integer;。 (L表示这是一种引用类型)