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