2015-07-05 3 views
0

Некоторое исключение возникает при попытке встраивать два класса:ClassFormatError: Поле «_callee__a1» в классе <Unknown> имеет нелегальную подпись «_callee»

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 является встраивать два поля, _A и _t в CI_Callee_2 , как член 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) 

путь к 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 «s, и его первоначальные члены (и его значения):

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

Я не делал никаких изменений в _fieldNode после его инициализации с помощью ClassNode CI_Callee_2. (Значение signature _fieldNode постоянно сохраняет NULL)

Есть ли видимые исключения? Благодарю.

ответ

0

Поле, созданное вами с именем "_callee__a1", имеет подпись _callee. Символ _ не является допустимым началом сигнатуры поля. Вы говорите, что хотите, чтобы тип был Integer, поэтому подпись поля должна быть Ljava/lang/Integer;. (L указывает, что это ссылочный тип)

+0

Все еще путать. 1) Я не могу понять, почему в сгенерированном коде есть подпись '' _callee', потому что '' _fieldNode.signature'' для посещенияField имеет значение NULL и инициализируется классомNode CI_Callee2 (никогда не изменяется). 2) В чем разница между '' signature'' и '' desc''? «Ljava/lang/Integer»; это описание, и оно уже было передано cw.visitField как '' desc'' правильно. –

+0

Я исправил его. Проблема в другом месте, где я передал неправильную строку «_callee» как desc для инструкции putField. –

+0

@shijie xu: API ASM использует имена, которые немного вводят в заблуждение. 'desc' - это то, что называется * сигнатурой * в другом месте, а' signature' - * общая сигнатура *, которая может быть «null». – Holger