gpt4 book ai didi

java - 带反射的嵌套 Protocol Buffer

转载 作者:搜寻专家 更新时间:2023-11-01 02:09:39 24 4
gpt4 key购买 nike

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

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

在 Java 中,是否可以仅使用字符串“bar.a”来设置字段 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());

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

关于java - 带反射的嵌套 Protocol Buffer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20626360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com