#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()