определение происхождения ``кода метода слишком большой``

Итак, я столкнулся с

MY: WARNING cannot transform class XYZ
java.lang.RuntimeException: Method code too large!
    at org.objectweb.asm.MethodWriter.a(Unknown Source)
    at org.objectweb.asm.ClassWriter.toByteArray(Unknown Source)
    at ...

Мне известно о слишком большом коде метода ! исключение с использованием ASM и проекта, на который оно ссылается.

Однако мне предоставили модифицированную версию ASM для работы, и поэтому использование этого проекта на самом деле не вариант.

Это потребует от меня ручного уничтожения оскорбительных методов. К счастью, это произошло только для одного библиотечного класса (пока -.-), так что это должно быть управляемо.

Однако я хотел бы обнаруживать слишком большие методы и сообщать о них. Так мне будет легче определить, что мне нужно разделить. (И, честно говоря, я не понимаю, почему эта информация не предоставляется с этой ошибкой по умолчанию.)

Я написал MethodVisitor, который оборачивает все вызовы super в блоки try-catch, а в exception-catch сообщает о методе, над которым работает, НО, так как метод toByteArray ClassWriter выдает ошибку, а используемый MethodVisitor для обхода байт-код создается как локальная переменная в нем, я еще не понял, как его вставить. Не могу переопределить метод toByteArray, потому что он, похоже, обращается к закрытым полям класса, и простое копирование не удается, потому что мне также нужно скопировать остальную часть пакета.

Я еще не пробовал инструментировать сам ClassWriter, но прежде чем идти туда, я хотел бы знать, есть ли более разумный способ выяснить, какой метод слишком велик.


person User1291    schedule 08.01.2018    source источник
comment
Простейшим подходом было бы отправить запрос функции разработчикам ASM; изменение кода генерации исключения, включающего имя и тип метода, потребует десяти секунд…   -  person Holger    schedule 08.01.2018


Ответы (1)


К вашему сведению, эта фиксация добавляет новое исключение, содержащее эту информацию. 6.2.1 был выпущен с фиксацией.

person Chad Retz    schedule 27.07.2018