2016-06-28 5 views
5

Ich scheine einen Weg zu finden, den Wert eines Feldes innerhalb einer Protobuf-Nachricht zu überprüfen, ohne seinen Getter explizit aufzurufen.Untersuchen einer Protobuf-Nachricht - wie Feldwerte nach Name erhalten?

Ich sehe Beispiele herum, die Verwendung von Descriptors.FieldDescriptor Instanzen innerhalb der Nachrichtenzuordnung zu erreichen, aber sie sind entweder Iterator-basierte oder durch Feldnummer gesteuert.

Sobald ich die Karte haben:

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

wie kann ich den Wert des Feldes "fieldXyz" bekommen?

Ich weiß, dass ich myMsg.getFieldXyz() verwenden kann, aber das ist nicht in einer systematischen Weise verwendbar.

Wenn es keine Möglichkeit gibt, auf Feldwerte mit ihren Namen zuzugreifen, würde ich gerne wissen, was die Gründe für diese Wahl sind. Ich habe vielleicht noch die Protobuf "Philosophie" zu verstehen :-)

Antwort

7

Ich bin mir nicht sicher, ob Sie nach Descriptors#findFieldByName(name) suchen. Sie können mit folgenden Versuchen versuchen:

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

Dies geht in eine vielversprechende Richtung. Wie kann ich herausfinden, in welche Java-Klasse ich das Objekt einfügen soll? Betrachtet man die API, sehe ich nur Methoden, die 'JavaType',' Type' und ähnliches zurückgeben. –

Verwandte Themen