2016-06-28 1 views
5

Кажется, я не могу найти способ проверить значение поля внутри сообщения protobuf без явного вызова его получателя.Рассмотрение сообщения protobuf - как получить значения полей по имени?

Я вижу примеры вокруг, которые используют экземпляры Descriptors.FieldDescriptor для доступа к карте сообщений, но они либо основаны на итераторе, либо управляются номером поля.

После того, как у меня есть карта:

Map<Descriptors.FieldDescriptor, Object> allFields = myMsg.getAllFields(); 

как я могу получить значение поля "fieldXyz"?

Я знаю, что могу использовать myMsg.getFieldXyz(), но это неприменимо систематически.

Если у вас нет доступа к значениям полей по их именам, я хотел бы знать, в чем причина этого выбора. Возможно, мне еще нужно понять философию protobuf :-)

ответ

7

Я не уверен, что вы ищете Descriptors#findFieldByName(name). Вы можете попробовать следующее:

FieldDescriptor fieldDescriptor = message.getDescriptorForType().findFieldByName("fieldXyz"); 
Object value = message.getField(fieldDescriptor); 
+1

Это движение в перспективном направлении. Как узнать, к какому классу Java я должен включить объект? Глядя на API, я вижу только методы, возвращающие 'JavaType',' Type' и аналогичные. –