MethodHandle Manipulation

Для моей работы с aspectJ и invokedynamic мне нужно вложить совет в метод, когда pointcut соответствует вызываемому методу. Сначала я заменил метод начальной загрузки invokedynamic-инструкции в сценарии своим собственным. Теперь в моем методе начальной загрузки я хочу вернуть CallSite, который сначала вызывает вызываемый метод, а затем совет, который я определил.

Проблема в том, что я должен вернуть сборку CallSite из ONE MethodHandle с той же типовой сигнатурой, которая использовалась в исходном загрузочном методе. Я думал о том, чтобы объединить два метода (оригинальный + совет) в новый и использовать его для возвращаемого CallSite. Но я не могу найти правильные методы для этого. MethodHandles.foldArguments выглядит многообещающе, но у меня не получилось. Другая идея состояла в том, чтобы создать MethodHandle из метода-обертки, который вызывает оригинальный дескриптор метода и рекомендацию, но проблема заключается в правильной сигнатуре типа.

У кого-нибудь есть идеи или предложения для меня? Как я могу пропатчить MethodHandle с советом?

Спасибо.

2 ответа

Решение

Я попробовал это с MethodHandles.guradwithtest, и это работает. Но это не очень удобно и работает только с вызовом чего-либо перед оригинальной методикой.

Но теперь я решил это по-другому. Я создал метод-обертку, который получает дескрипторы метода и вызывает их желаемым способом. Затем я получаю этот метод-обертку как MethodHandle и вставляю аргументы. Тогда wrappermethod.asCollector(...) и wrappermethod.asType(...) Вот и все. Извините за краткое объяснение. Вы можете попросить более подробную информацию.

Imho самый простой способ для постобработки - это использовать MethodHandles # filterReturnValue. Это позволяет выполнить целевой метод, а затем выполнить фильтрацию возвращаемого значения. Вы можете просто вернуть то, что входит, и сделать то, что вам нужно сделать с вашим советом. Конечно, вам нужно будет выполнить преобразования типов, чтобы согласовать типы, но это не должно быть серьезной проблемой. Для предварительной обработки я бы, вероятно, отфильтровал аргумент, который я добавил ранее, а затем отбросил.

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