假设我有一个包含以下内容的.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);
}
但是当我这样做时,我会得到一个非法参数异常。
有人知道如何以通用的方式解决这个问题吗?
我也需要另一种方式。
public Object getValue(Foo message, String fieldPath) {
// This doesn't work
FieldDescriptor fd = message.getDefaultInstanceForType().findFieldByName(fieldPath);
return message.getField(fieldPath);
}
作为一条注意事项,如果fieldPath不包含分隔符(“.”)并且引用的是基础Message而不是嵌套Message,则此方法可以正常工作。
foo.a
是正确的吗?我认为应该是foo.bar.a
(根据 Foo 的结构)? - Muel