繁体   English   中英

带反射的嵌套协议缓冲区

[英]Nested Protocol Buffers with reflection

假设我在.proto文件中有一条消息,其中包含以下内容

Message Foo {
    Message Bar {
        optional int32 a = 1;
        optional int32 b = 2;
    }
    optional Bar bar = 1;
}

在Java中,无论如何设置字段只使用字符串“bar.a”? 理想情况下,我想编写如下方法:

public Foo.Builder apply(Foo.Builder builder, String fieldPath, Object value) {
    // fieldPath == "bar.a"
    // This doesn't work
    FieldDescriptor fd = builder.getDefaultInstanceForType().findFieldByName(fieldPath);
    builder = builder.setField(fd, value);
}

但是当我这样做时,我得到一个IllegalArgumentException。

有谁知道如何以通用的方式做到这一点?

我也需要走另一条路

public Object getValue(Foo message, String fieldPath) {
    // This doesn't work
    FieldDescriptor fd = message.getDefaultInstanceForType().findFieldByName(fieldPath);
    return message.getField(fieldPath);
}

请注意,如果fieldPath不包含分隔符(“。”)并引用基本消息,而不是嵌套消息,则此方法可以正常工作。

您需要在“。”上拆分字段路径。 并进行一系列查找,例如

Message subMessage =
    (Message)message.getField(
        message.getDescriptorForType().findFieldByName("bar"));
return subMessage.getField(
    subMessage.getDescriptorForType().findFieldByName("a"));

或者写:

FieldDescriptor desc = message.getDescriptorForType().findFieldByName("bar");
Message.Builder subBuilder = (Message.Builder)builder.getFieldBuilder(desc);
subBuilder.setField(
    subMessage.getDescriptorForType().findFieldByName("a"), value);
builder.setField(desc, subBuilder.build());

您当然可以编写一个库来分割字符串并在一次调用中执行所有查找(并进行适当的错误检查)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM