Ответ 1
Если я правильно понимаю ваш вопрос, я достиг того же, что и вы, но по-другому.
Используя модификацию байтового кода, управляемого событиями ASM, я в первую очередь переименовал someMethod (arg, arg, arg) в copyOf_someMethod (arg, arg, arg). Затем я создал новый метод, называемый someMethod (arg, arg, arg), который сделал некоторую обработку, а затем вызвал copyOf_someMethod (arg, arg, arg).
Я использовал метод переименования в методе visitMethod (..) реализованного класса ClassVisitor:
MethodVisitor methodVisitor =
super.visitMethod(
methodAccess, "copyOf_" + methodName, methodDesc,
methodSignature, methodExceptions );
return methodVisitor;
В visitMethod (..) я также сохранил все детали подписи метода в переменных класса, готовых для использования в методе visitEnd().
Я фактически сохранил данные метода в объекте MethodDetail и поместил его в очередь:
private Queue<MethodDetail> methodDetails = new LinkedList<MethodDetail>();
Я создал новую реализацию someMethod (arg, arg, arg), используя метод visitEnd() реализованного ClassVisitor I. Я использовал ASMFier для генерации кода для ввода метода visitEnd(). В реализации использовались данные, которые я хранил ранее в visitMethod (..). Новая реализация сделала некоторую обработку, а затем вызвала copyOf_someMethod(). В методе visitEnd() я вытащил все MethodDetail очереди и для каждого MethodDetail, называемого ASM-кодом, который я ранее создал ASMFier.
Используя этот проект, я создал прокси для метода, который сделал некоторую обработку, а затем вызвал оригинальный метод. Обратите внимание, что исходный метод был переименован в copyOf_someMethod (..). Также обратите внимание, что я представил новую реализацию для исходного метода, который выступал в качестве прокси.
Для поддержки нескольких аргументов я использовал ASMFier для генерации другого кода для 1 arg, 2 arg, 3 arg, e.t.c. Я поддерживал до 7 аргументов и выбрал Unsupported Exception, если у метода, который был проксирован, было более 7 аргументов. В методе visitEnd (..) я назвал другой код (который был сгенерирован ASMFier) в зависимости от того, сколько аргументов метода было использовано исходным методом.
Я использовал javaagent для перехвата загрузки класса и изменения байтов.
Поскольку я новичок в ASM, возможно, я не понял ваш вопрос правильно - однако, если вы задавали вопрос о создании прокси-сервера, который выполняет некоторую обработку, а затем вызывает оригинальный метод, то мое решение работает. Кажется, это было не так медленно. Время загрузки класса для класса, у которого его проксированные методы были не намного медленнее, чем без изменения байтового кода. Скорость выполнения введенного кода не была медленной, ASM-код, созданный ASMFier, кажется очень быстрым.
Приветствия