avoid repeated calls to build() during deserialization by obtaining field types from the Message's defaultInstance (#1215)

This commit is contained in:
Ori Schwartz 2017-12-27 22:14:16 -05:00 committed by inder123
parent 3bf1967c0a
commit c744ccd51c

View File

@ -263,6 +263,9 @@ public class ProtoTypeAdapter
Message.Builder protoBuilder =
(Message.Builder) getCachedMethod(protoClass, "newBuilder").invoke(null);
Message defaultInstance =
(Message) getCachedMethod(protoClass, "getDefaultInstance").invoke(null);
Descriptor protoDescriptor =
(Descriptor) getCachedMethod(protoClass, "getDescriptor").invoke(null);
// Call setters on all of the available fields
@ -300,8 +303,7 @@ public class ProtoTypeAdapter
fieldValue = context.deserialize(jsonElement, protoArrayFieldType);
protoBuilder.setField(fieldDescriptor, fieldValue);
} else {
Message prototype = protoBuilder.build();
Object field = prototype.getField(fieldDescriptor);
Object field = defaultInstance.getField(fieldDescriptor);
fieldValue = context.deserialize(jsonElement, field.getClass());
protoBuilder.setField(fieldDescriptor, fieldValue);
}