鉴于以下原语定义:
syntax = "proto3";
import "google/protobuf/descriptor.proto";
option java_package = "com.example.dto";
option java_multiple_files = true;
extend google.protobuf.FieldOptions {
Projector projector = 50002;
}
message Projector {
string name = 1;
string class = 2;
bool default = 3;
}
message SearchRequest {
string query = 1 [(projector) = {name: "queryProjector", class: "foobar"}];
int32 page_number = 2;
int32 result_per_page = 3;
}如何访问字段扩展?
据我所知,扩展仍然在proto3中工作,但通常被Any类型所取代?
我走了这么远
final Descriptors.Descriptor descriptor = SearchRequest.getDescriptor();
final Descriptors.FieldDescriptor query = descriptor.findFieldByName("query");这条路对吗?下一步是什么?
发布于 2018-02-15 13:38:36
如前所述,https://github.com/google/protobuf/issues/1460
仍然支持自定义选项。这是您在proto3中唯一可以使用扩展的地方。它的工作方式与在proto2中相同。不支持proto2的语言可能会提供一个特殊的API来访问自定义选项,因为它们不支持扩展。
因此,自定义选项似乎仍然受到支持,您应该使用
descriptor.findFieldByName("query").getOptions().getAllFields();这将返回自定义选项的映射(作为字段)。
final Map<Descriptors.FieldDescriptor, Object> allFields;而该值将是您的选择类型,投影仪在您的情况下。
这个自定义选项(投影仪)的FileDescriptor似乎是在以*.proto文件命名的类中以公共静态的形式使用其camelCase名称生成的。
如果您的proto文件名为search_service_v1.proto,您可以直接找到自定义选项,如下所示:
final DescriptorProtos.FieldOptions options descriptor.findFieldByName("query").getOptions();
final Object field = options.getField(SearchServiceV1.projector.getDescriptor());你会得到你的分机
final Projector projector = Projector.class.cast(field);https://stackoverflow.com/questions/46619005
复制相似问题