РЕДАКТИРОВАТЬ: я описал наше решение на { ссылка }
У меня есть java объект. Это экземпляр одного из многих подклассов, расширяющих абстрактный класс. Я хотел бы изменить один из его методов так, чтобы он выполнял некоторый дополнительный код перед вызовом исходного метода. Моя цель концептуально такая же, как pointcut в AspectJ.
Хорошо, если я создам некоторую модифицированную версию исходного объекта, а не изменю оригинал. Также хорошо, если решение включает в себя манипулирование байт-кодом.
Предыдущая работа
Я рассмотрел вопрос создания прокси через JavaAssist. Проблема в том, что метод create ProxyFactory ожидает, что я заранее знаю типы ввода конструктора. Я не. Я могу создать свой объект, не вызывая конструктор через Objenesis, но тогда полученный прокси-объект будет иметь нулевые значения для любых значений, установленных конструктором. Это означает, что мой результирующий объект будет вести себя не так, как исходный, всякий раз, когда на значение, установленное конструктором, прямо ссылаются.
Контекст
Мы используем Flink через AWS Kinesis Аналитика данных для преобразования некоторых потоковых данных. Мы хотели бы включить общий код в начало всех наших StreamOperator open () методов без необходимости изменения каждого оператора. Одним из вариантов использования этого является обеспечение того, чтобы пользовательский агент метрик работал в каждом экземпляре, на котором работает оператор.