2016-06-28 47 views
5

Non riesco a trovare un modo per verificare il valore di un campo all'interno di un messaggio protobuf senza invocare esplicitamente il suo getter.Esaminare un messaggio protobuf: come ottenere i valori del campo per nome?

Vedo esempi in giro che rendono l'utilizzo delle istanze Descriptors.FieldDescriptor da raggiungere all'interno della mappa messaggi, ma sono basate su iteratore o guidate dal numero di campo.

Una volta che ho la mappa:

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

come posso ottenere il valore di campo "fieldXyz"?

So che posso utilizzare myMsg.getFieldXyz(), ma questo non è utilizzabile in modo sistematico.

Se non c'è modo di accedere ai valori di campo con il loro nome, mi piacerebbe sapere qual è la logica alla base di questa scelta. Forse devo ancora capire la "filosofia" protobuf :-)

risposta

7

Non sono sicuro che stiate cercando Descriptors#findFieldByName(name). Puoi provare con:

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

Questo sta andando in una direzione promettente. Come faccio a sapere in quale classe Java dovrei lanciare l'oggetto? Guardando l'API vedo solo metodi che restituiscono 'JavaType',' Type' e simili. –