Некоторое исключение возникает при попытке встраивать два класса: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)
Есть ли видимые исключения? Благодарю.
Все еще путать. 1) Я не могу понять, почему в сгенерированном коде есть подпись '' _callee', потому что '' _fieldNode.signature'' для посещенияField имеет значение NULL и инициализируется классомNode CI_Callee2 (никогда не изменяется). 2) В чем разница между '' signature'' и '' desc''? «Ljava/lang/Integer»; это описание, и оно уже было передано cw.visitField как '' desc'' правильно. –
Я исправил его. Проблема в другом месте, где я передал неправильную строку «_callee» как desc для инструкции putField. –
@shijie xu: API ASM использует имена, которые немного вводят в заблуждение. 'desc' - это то, что называется * сигнатурой * в другом месте, а' signature' - * общая сигнатура *, которая может быть «null». – Holger