这篇文章主要描述如何使用程序获取proto
文件的信息。
生成desc
文件命令
1 | protoc -I=IMPORT_PATH --descriptor_set_out=DST_FILE path/to/file.proto |
proto提供了api可以解析desc
文件来获取proto文件的信息。
定义proto
文件
定义一个包含自定义选项的
proto
文件options.proto
,内容如下:1
2
3
4
5
6
7
8
9syntax = "proto3";
import "protoc/google/protobuf/descriptor.proto";
option java_package = "sky.test";
option java_outer_classname = "Options";
extend google.protobuf.MessageOptions {
int32 msgid = 54321;
}定义一个使用了自定义选项的
proto
文件test.proto
,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18syntax = "proto3";
import "options.proto";
option java_package = "sky.test";
option java_outer_classname = "Test";
message persion {
string name = 1;
int32 age = 2;
repeated string like = 3;
}
message people {
option (msgid) = 1111;
repeated persion persions = 1;
string country = 2;
}
生成desc
文件
1 | protoc --descriptor_set_out=test.desc options.proto test.proto |
使用以上指令将options.proto
,test.proto
两个文件的描述信息生成到同一个desc
文件中。
获取扩展信息
1 | public static void getExtendInfo(String extendDescFile) throws Exception { |
运行代码,输出如下:1
2
3
4
5
6
7
8
9name: "msgid"
extendee: ".google.protobuf.MessageOptions"
number: 54321
label: LABEL_OPTIONAL
type: TYPE_INT32
json_name: "msgid"
msgid
54321
获取proto
文件的name,options,message等信息
1 | public static void getMsgInfo(String descFile) throws Exception { |
运行代码,输出如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45proto file name :options.proto
proto file Options :java_package: "sky.test"
java_outer_classname: "Options"
proto file name :test.proto
proto file Options :java_package: "sky.test"
java_outer_classname: "Test"
msg persion 的字段信息
name: "name"
number: 1
label: LABEL_OPTIONAL
type: TYPE_STRING
json_name: "name"
name: "age"
number: 2
label: LABEL_OPTIONAL
type: TYPE_INT32
json_name: "age"
name: "like"
number: 3
label: LABEL_REPEATED
type: TYPE_STRING
json_name: "like"
msg people 的字段信息
name: "persions"
number: 1
label: LABEL_REPEATED
type: TYPE_MESSAGE
type_name: ".persion"
json_name: "persions"
name: "country"
number: 2
label: LABEL_OPTIONAL
type: TYPE_STRING
json_name: "country"
UnknownFieldSet.Field key:54321
[1111]