Why not just call add() with a Message instance instead?

On Mon, Jul 9, 2018 at 7:39 PM, John Lilley <[email protected]> wrote:
> Darn, there's only one snag.  I need the protobuf package name, not the java
> package classname, in order to construct the message name that corresponds
> to the result of full_name() in the C++ generated code.  Of course, I can
> make them the same thing, but I'm not finding any way to interrogate the
> class to find out the package to which it belongs.
> john
>
> On Mon, Jul 9, 2018 at 5:17 PM John Lilley <[email protected]> wrote:
>>
>> Success!  This works nicely (although, lacking polish)
>>
>> public class MessageFactory {
>>
>>    private final Map<String,Message> defaultMessages = new HashMap<>();
>>
>>    public void add(Class wrapperClass) {
>>       for (Class nestedClass : wrapperClass.getDeclaredClasses()) {
>>          if (!Message.class.isAssignableFrom(nestedClass)) {
>>             continue;
>>          }
>>          try {
>>             String fullName = wrapperClass.getSimpleName() + "." +
>> nestedClass.getSimpleName();
>>             Message message =
>> (Message)nestedClass.getMethod("getDefaultInstance").invoke(null);
>>             defaultMessages.put(fullName, message);
>>          } catch (Exception ex) {
>>             ex.printStackTrace();
>>          }
>>       }
>>    }
>>
>>    public Message.Builder getBuilder(String fullName) {
>>       Message message = defaultMessages.get(fullName);
>>       if (message == null) {
>>          throw new IllegalArgumentException("Unknown message name '" +
>> fullName + "'");
>>       }
>>       return message.newBuilderForType();
>>    }
>>
>>    public Message createMessage(String fullName, InputStream is) throws
>> Exception {
>>       Message.Builder builder = getBuilder(fullName);
>>       CodedInputStream cis = CodedInputStream.newInstance(is);
>>       return builder.mergeFrom(cis).build();
>>    }
>>
>>
>>    public Message createMessage(String fullName, byte[] buffer) throws
>> Exception {
>>       return createMessage(fullName, new ByteArrayInputStream(buffer));
>>    }
>> }
>>
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Protocol Buffers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/protobuf.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to