Byte Buddy позволяет вам корректировать код библиотеки, например, с помощью агента Java. Агент Java получает уведомление о загрузке любого класса и, используя его, вы можете заменить любой вызов на new File()
своим new AmazonS3File()
. Для этого вам необходимо преобразовать все классы в пакете, где эта замена в коде актуальна. Для этого вы должны использовать MemberSubstitution
:
new AgentBuilder.Default()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type(nameStartsWith("pkg.of.library."))
.transform((builder, typeDescription, classLoader, module) -> builder.visit(MemberSubstitution.strict()
.constructor(isDeclaredBy(File.class))
.replaceWith(MyFactory.class.getMethod("file", String.class))
.on(any()))
.installOnByteBuddyAgent();
Чтобы сделать эту работу, вам нужно будет создать некоторый фабричный класс MyFactory
, который возвращает любой экземпляр типа File
, где вы можете, например, верните ваш файл Amazon, если он имеет значение Java File
.
Подстановка в основном говорит: для любого типа в пакете и подпакетах pgk.of.library , scan any()
метод или конструктор для конструкторов File
и замена их вызовом MyFactory::file
. Чтобы это работало, фабрика должна иметь те же аргументы, что и заменяемый конструктор файла.