Я пытался найти полезный ответ, но безуспешно. Интересно, можно ли было бы использовать byte-buddy для следующего:
Допустим, у нас есть POJO с количеством значений. Для определенного вида обработки меня интересуют только некоторые. Я мог бы пометить их аннотацией, например, @ConditionalData, которую я мог бы поместить в получатели или поля.
Тогда я мог бы создать и inteface, скажем, NVPProvider, который бы возвращал имя поля - значение карты.
Делать это с отражением возможно, но это не слишком эффективно. Я надеялся, что смогу использовать байтовый компаньон для расширения класса интерфейсом и реализации метода, но на самом деле я не нахожу, как создать реализацию для достижения этого.
Я прошел реализацию:
net.bytebuddy.implementation.Implementation
и пытался найти примеры вокруг веб-страниц, но я не нашел правильного пути.
public interface NVPProvider {
Map<String, Object> getDataAsNVP();
}
public <O> Builder<O> instrumentType(Builder<O> builder) {
builder.implement(NVPProvider.class).method(net.bytebuddy.matcher.ElementMatchers.named("getDataAsNVP")).intercept( ??? );
return builder.implement(NVPProvider.class);
}
Интересно, есть ли способ, которым я бы итерировал поля и геттеры и сопоставлял объекты Accessible путем рефлексивного получения аннотаций, однако на основе этого я мог бы составить реализацию метода интерфейса, итерируя соответствующие поля и внося вклад в В результате на карте воображаемый сгенерированный код будет выглядеть так:
Map<String, Object> result = new HashMap<>();
Object obj0 = getValue001();
result.put("getValue001", obj0);
Object ob10 = accesibleField1;
result.put("ob10 ", ob10 );
Позже я мог бы добавить атрибут аннотации для лучшего вида клавиш.
Я видел примеры с
MethodDelegation.to(interceptor)
однако, тогда я теперь вижу, как это сделать без отражения.
У меня есть идея, как это сделать с Javassist, где вы на самом деле можете создавать фрагменты кода, которые вы позже скомпилируете, но я не уверен, как это сделать с помощью byte-buddy. Я использовал byte-budy для расширения POJO с помощью простых методов получения, динамически определенных в конфигурационном файле, и это выглядит хорошо. Наличие только одного инструмента манипуляции байтами было бы чище.
Спасибо за любые советы.