Рассчитать размер байт-кода метода
В настоящее время я внедряю специализированный инструмент метрики программного обеспечения, используя библиотеку ASM. Единственный способ вычислить размер метода с помощью этой библиотеки - вручную увеличивать некоторую переменную размера при каждом посещении инструкции, что для меня несколько неверно. Есть еще один распространенный способ вычисления размера байт-кода метода? Или расчет размера каждой инструкции достаточно разумен?
1 ответ
Добавление размеров инструкций вручную не будет работать с ASM, поскольку ASM фокусируется на обработке инструкций и удобно скрывает различные формы семантически идентичных инструкций.
Например, ALOAD_0
(один байт), ALOAD 0
(два байта) и WIDE ALOAD 0
(четыре байта) имеют одинаковое значение и сообщаются MethodVisitor
через visitVarInsn(Opcodes.ALOAD, 0)
вызов. Тогда вам не нужно заботиться о различных формах при обработке этой инструкции, но вы не знаете, какая из них присутствовала в исходном файле класса.
Поскольку ASM не предоставляет API для прямого взаимодействия с Code
атрибут, он не подходит для этой конкретной задачи. Этот ответ содержит пример того, как этого добиться с помощью Javassist.