From fa86af5ff5ad17483b73938f8e413c2cd5aee0c9 Mon Sep 17 00:00:00 2001 From: blakeli Date: Mon, 7 Apr 2025 19:36:52 -0400 Subject: [PATCH] Decouple MessageReflection from GeneratedMessage --- .../com/google/protobuf/MessageReflection.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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;