当我尝试内联两个类时会发生一些异常:
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)
有没有人见过这个例外?谢谢。
答案 0 :(得分:0)
您使用名称&#34; _callee__a1&#34;创建的字段有签名_callee
。字符_
不是字段签名的有效开头。您说您希望类型为Integer
,因此字段签名应为Ljava/lang/Integer;
。 (L
表示这是一种引用类型)