Вставить код из метода в новый класс

Я пытаюсь создать библиотеку поверх байтбадди, которая может использоваться для выполнения преобразований во время выполнения в классе. API, который я создаю, напрямую не работает с ByteBuddy, чтобы вставить код метода в преобразованные классы (я хочу, чтобы новые методы были добавлены совершенно новым для преобразованного класса, а методы, аннотированные с помощью @Inject были введены в голову или хвост существующего метода). Моим решением проблемы отсутствия интероперабельности было создание временного класса с использованием ByteBuddy, который преобразуется между моим API более высокого уровня и API-интерфейсом API ByteBuddy. Но я не могу понять, как я могу вставить весь код из метода в API более высокого уровня в методы, определенные на более низком уровне, поскольку я не могу использовать Advice для этого. Могу ли я это сделать?

Это код, который я придумал до этого момента.

 fun apply(vararg transformerClasses: Class<*>) { for(clazz in transformerClasses) { val builder = ByteBuddy() .subclass(clazz) val mixinAnnotation = clazz.getAnnotation(Mixin::class.java) as? Mixin ?: throw RuntimeException("Passed transformer class without @Mixin annotation") val mixinTarget = mixinAnnotation.target.java for(method in clazz.declaredMethods) { if(method.annotations.isEmpty()) { builder.defineMethod(method.name, method.returnType, Visibility.PUBLIC, Ownership.STATIC) .intercept(???) } } } } 

На самом деле нет хорошего способа сделать это, но одним из решений было бы создать экземпляр TypeDescription котором вы переводите свои пользовательские аннотации в слова Byte Buddy. Вы можете использовать реализацию InstrumentedType для создания такого объекта.

Byte Buddy по-прежнему считывает байт-код из правильного файла класса, если имя класса совпадает. Нет никакой проверки согласованности между файлом класса и описанием типа.