Рассчитать размер байт-кода метода

В настоящее время я внедряю специализированный инструмент метрики программного обеспечения, используя библиотеку ASM. Единственный способ вычислить размер метода с помощью этой библиотеки - вручную увеличивать некоторую переменную размера при каждом посещении инструкции, что для меня несколько неверно. Есть еще один распространенный способ вычисления размера байт-кода метода? Или расчет размера каждой инструкции достаточно разумен?

1 ответ

Решение

Добавление размеров инструкций вручную не будет работать с ASM, поскольку ASM фокусируется на обработке инструкций и удобно скрывает различные формы семантически идентичных инструкций.

Например, ALOAD_0 (один байт), ALOAD  0 (два байта) и WIDE ALOAD  0 (четыре байта) имеют одинаковое значение и сообщаются MethodVisitor через visitVarInsn(Opcodes.ALOAD, 0) вызов. Тогда вам не нужно заботиться о различных формах при обработке этой инструкции, но вы не знаете, какая из них присутствовала в исходном файле класса.

Поскольку ASM не предоставляет API для прямого взаимодействия с Code атрибут, он не подходит для этой конкретной задачи. Этот ответ содержит пример того, как этого добиться с помощью Javassist.

Другие вопросы по тегам