说我在.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());
您当然可以编写一个库,该库将字符串拆分并在一个调用中进行所有查找(并进行正确的错误检查)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句