Я пытаюсь проанализировать байт-код с помощью 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, ни пока что не дали положительного результата.