Il me semble impossible de trouver un moyen de vérifier la valeur d'un champ à l'intérieur d'un message protobuf sans invoquer explicitement son getter.
Je vois des exemples autour qui utilisent des instances de Descriptors.FieldDescriptor
Pour atteindre l'intérieur de la mappe de messages, mais elles sont basées sur un itérateur ou pilotées par le numéro de champ.
Une fois que j'ai la carte:
Map<Descriptors.FieldDescriptor, Object> allFields = myMsg.getAllFields();
comment puis-je obtenir la valeur du champ "fieldXyz"
?
Je sais que je peux utiliser myMsg.getFieldXyz()
, mais ce n'est pas utilisable de manière systématique.
S'il n'y a aucun moyen d'accéder aux valeurs des champs par leurs noms, j'aimerais savoir quelle est la justification de ce choix. J'ai peut-être encore à comprendre la "philosophie" du protobuf :-)
Je ne suis pas sûr que vous recherchiez Descriptors#findFieldByName(name)
. Vous pouvez essayer avec les éléments suivants:
FieldDescriptor fieldDescriptor = message.getDescriptorForType().findFieldByName("fieldXyz");
Object value = message.getField(fieldDescriptor);
Je sais que cela est balisé pour Java mais au cas où quiconque cherche un moyen d'obtenir la valeur en c ++: (en supposant: field = FieldDescriptor * qui contient un int32)
int32_t value = message_1.GetReflection()->GetInt32(message_1, field);
Il m'a fallu un certain temps pour l'obtenir et je n'ai trouvé aucune référence de stackoverflow, ce qui l'ajoute. J'espère que ça aide. Merci!