Получить описание поля для защищенного поля в одном из суперклассов

#byte-buddy

#byte-buddy

Вопрос:

На основе определения типа (например. инструментальный тип) Я хочу быстро найти описание поля для защищенной переменной. Я знаю, что переменная есть в одном из суперклассов, но я точно не знаю, в каком именно. Вот упрощенный пример:

 class C1 { protected int id; }

class C2 extends C1 {}
  

На основе определения типа1 = Описание типа.ForLoadedType.of(C1.class ), я могу найти поле, сделав что-то вроде этого:

 typeDefinitionC1.getDeclaredFields().filter(named("id")).getOnly()
  

Но использование определения типа для C2 не работает, потому что поле не объявлено в C2. Я написал небольшую функцию для перебора всех суперклассов, чтобы найти поле, но я ожидаю, что ByteBuddy позволит мне сделать что-то вроде:

 typeDefinitionC2.getFields().filter(named("id").and(isProtected())).getOnly()
  

Есть ли какой-нибудь удобный способ сделать это?

Ответ №1:

Вы можете использовать new FieldLocator.ForExactType(typeDefinitionC1).locate(named("id")) .

Byte Buddy не использует местоположение в API описания, как это делает API отражения, поскольку местоположение часто зависит от сайта поиска и варианта использования.

Комментарии:

1. Предложенное решение не решило проблему, но помогло мне найти решение, которое я искал: new FieldLocator.ForClassHierarchy(C2.asErasure()).locate("id").getField()