Я пытаюсь проанализировать байтовый код с помощью javassist, используя простой класс MyData
:
class MyData {
private Collection<String> strings = new ArrayList<String>();
// .....................
public void add(String str) {
strings.add(str); // line number 35
}
// .....................
}
Вот код, который я использую для этого класса:
ClassFile cf = new ClassFile(new DataInputStream(TryJavassist.class.getResourceAsStream("MyData.class")));
MethodInfo minfo = cf.getMethod("add");
CodeAttribute ca = minfo.getCodeAttribute();
for (CodeIterator ci = ca.iterator(); ci.hasNext();) {
int index = ci.next();
int op = ci.byteAt(index);
System.out.println(op + "=" + Mnemonic.OPCODE[op] + ": " + minfo.getLineNumber(index));
}
Он работает и печатает:
42=aload_0: 35
180=getfield: 35
43=aload_1: 35
185=invokeinterface: 35
87=pop: 35
177=return: 36
Строка 35 вызывает метод add()
коллекции с именем strings
. Фрагмент кода, который я разместил, извлекает только invokeinterface
и строку 35. Хорошо, я могу знать, что это было поле класса (getfield
).
Я хотел бы знать, как получить остальную информацию:
- имя поля
strings
- вызываемый метод интерфейса
add()
Ни гугление, ни чтение API doc пока не дали положительного результата.