public static void main(String[] args) throws Exception {
Runtime run = Runtime.getRuntime();
String dir = System.getProperty("user.dir");
String source = dir + "/protoc/";
String cmd = "cmd /c " + source + "protoc.exe -I=" + source + " --descriptor_set_out="+ source +"addressbook.desc "+ source +"addressbook.proto";
System.out.println(cmd);
Process p = run.exec(cmd);
// 如果不正常终止, 则生成desc文件失败
if (p.waitFor() != 0) {
if (p.exitValue() == 1) {//p.exitValue()==0表示正常结束,1:非正常结束
System.err.println("命令执行失败!");
System.exit(1);
}
}
Map
FileInputStream fin = new FileInputStream("addressbook.desc");
FileDescriptorSet descriptorSet = FileDescriptorSet.parseFrom(fin);
for (FileDescriptorProto fdp: descriptorSet.getFileList()) {
FileDescriptor fd = FileDescriptor.buildFrom(fdp, new FileDescriptor[]{});
for (Descriptor descriptor : fd.getMessageTypes()) {
String className = fdp.getOptions().getJavaPackage() + "."
+ fdp.getOptions().getJavaOuterClassname() + "$"
+ descriptor.getName();
List
for(FieldDescriptor type : types) {
System.out.println(type.getFullName());
}
System.out.println(descriptor.getFullName() + " -> " + className);
}
}
// Descriptor md = fd.getDescriptorForType();
// byte[] data = null ;
// DynamicMessage m = DynamicMessage.parseFrom(md, data);
}
}
三、结果截图

[java]
package com.example.tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
package com.example.tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}