diff --git a/protobuf-api/src/main/java/com/google/protobuf/MessageReflection.java b/protobuf-api/src/main/java/com/google/protobuf/MessageReflection.java index e33cc45..bb5871e 100644 --- a/protobuf-api/src/main/java/com/google/protobuf/MessageReflection.java +++ b/protobuf-api/src/main/java/com/google/protobuf/MessageReflection.java @@ -11,6 +11,7 @@ import com.google.protobuf.Descriptors.FieldDescriptor; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -638,7 +639,7 @@ public WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor d return WireFormat.Utf8Validation.STRICT; } // TODO: support lazy strings for repeated fields. - if (!descriptor.isRepeated() && builder instanceof GeneratedMessage.Builder) { + if (!descriptor.isRepeated() && GENERATED_MESSAGE_BUILDER.isInstance(builder)) { return WireFormat.Utf8Validation.LAZY; } return WireFormat.Utf8Validation.LOOSE; @@ -650,6 +651,20 @@ public Object finish() { } } + private static final Class GENERATED_MESSAGE_BUILDER = getGeneratedMessageBuilder(); + + private static Class getGeneratedMessageBuilder() { + try { + Class generatedMessageLiteClass = Class.forName("com.google.protobuf.GeneratedMessage"); + return Arrays.stream(generatedMessageLiteClass.getClasses()) + .filter(innerClass -> innerClass.getName().equals("com.google.protobuf.GeneratedMessage$Builder")) + .findFirst() + .get(); + } catch (Throwable e) { + return null; + } + } + static class ExtensionAdapter implements MergeTarget { private final FieldSet extensions;