ASM API не поддерживает доступ к этой информации до обхода инструкций.
Одним из решений будет двойной обход класса, сохранение максимальных значений в первом проходе.
Альтернатива временно хранить информацию о текущем методе. Дерево API ASM может помочь вам здесь. Класс MethodNode
реализует MethodVisitor
, хранит все посещенные артефакты и имеет accept(MethodVisitor)
для посещения всех сохраненных артефактов:
classReader.accept(new ClassVisitor(Opcodes.ASM7) {
@Override
public MethodVisitor visitMethod(int access, String name, String descriptor,
String signature, String[] exceptions) {
MethodVisitor actualVisitor = new MethodVisitor(Opcodes.ASM7) {
@Override
public void visitInsn(int opcode) {
System.out.printf("%02x%n", opcode);
}
@Override
public void visitMaxs(int maxStack, int maxLocals) {
System.out.println("max stack: "+maxStack);
}
};
return new MethodNode(Opcodes.ASM7) {
@Override
public void visitMaxs(int maxStack, int maxLocals) {
actualVisitor.visitMaxs(maxStack, maxLocals);
super.visitMaxs(maxStack, maxLocals);
}
@Override
public void visitEnd() {
accept(actualVisitor);
}
};
}
}, 0);
Так что здесь мы сохраняем исходный MethodVisitor
как есть, но возвращаем адаптер, реализующий предполагаемую модификацию. Это подкласс MethodNode
, записывающий все артефакты, но сообщающий visitMaxs
немедленно actualVisitor
, затем на visitEnd
будет accept(actualVisitor)
для просмотра всей записанной информации.
Обратите внимание, что, следовательно, actualVisitor
встретится visitMaxs
дважды, один раз перед всеми другими элементами, затем снова в стандартной последовательности событий.