Enthought Traits имеет модуль, который работает достаточно хорошо для этого. https://traits.readthedocs.org/en/4.3.0/_modules/traits/util/refresh.html
Он перезагрузит любой измененный модуль и обновлять другие модули и объекты, которые его используют. Он не работает большую часть времени с методами __very_private__
и может захлебываться от наследования классов, но это избавляет меня от сумасшедшего времени от необходимости перезапуска приложения-хозяина при написании PyQt guis или материала, который запускается внутри таких программ, как Maya или Nuke. Это не работает, возможно, в 20-30% случаев, но это все еще невероятно полезно.
Пакет Enthoughtht не перезагружает файлы в тот момент, когда они меняются - вы должны называть это явно - но это не должно " t быть все, что трудно реализовать, если вам это действительно нужно
Инструкция ALOAD содержит числовой аргумент, который сообщает, какую локальную переменную она загружает. Как только мы получим это, мы посмотрим в methodnode.localVariables
(что вы уже печатали на экране), чтобы найти правильный.
Итак, один из способов - сначала выяснить, какой класс представляет инструкции ALOAD. Вы можете выполнить поиск в Google, например, « aload extends abstractinsnnode site: asm.ow2.io », чтобы найти * InsnNode для использования. Ответ для ALOAD - VarInsnNode . Он, безусловно, содержит поле int var
, в котором содержится номер локальной переменной, которую он загружает. Оно должно соответствовать полю int index
в списке LocalVariableNode
. Однако один и тот же индекс может быть повторно использован для различных целей в одном и том же методе, поэтому вам также необходимо убедиться, что ваша инструкция находится между инструкциями LabelNode, указанными в инструкциях LabelNode start
и LabelNode end
в LocalVariableNode
. Самый простой способ сделать это - просто использовать BasicAnalyer, как рекомендовано @Holger в его комментарии к ответу @Antimony . Таким образом, вы получаете связанный объект Frame для вашего VarInsnNode и делаете frame.getStack(((VarInsnNode) abstractNode).var)
, чтобы получить описание переменной для инструкции ALOAD.
Java-байт-код неявно типизирован, поэтому нет прямого способа найти типы значений в байт-коде. Вы должны выполнить анализ потока данных, чтобы найти, где было создано значение, и получить тип таким образом. Если у класса есть стековые карты, вам просто нужно отследить его до предыдущей стековой карты, но он все равно потребует кучу работы.