Java Proto 名称
本文档介绍了基于不同 proto 选项,proto 的完全限定 Java 名称是什么。此名称对应于您需要导入以使用该消息的包。
建议
- 设置
option java_multiple_files = true;
- 设置
option java_outer_classname = "FileNameProto";
- 设置
option java_package = "com.google.package";
说明
多文件
使用 java_multiple_files = true
时,为每条消息生成的 Java 类将被放置在一个单独的 .java
文件中。这使得将消息从一个 .proto
文件移动到另一个文件变得容易得多。
外部类名
系统会为 .proto
文件本身生成一个 Java 类。如果未指定,文件的类名将自动生成。但是,该名称的生成规则过于复杂且不直观。最佳策略是显式地将 java_outer_classname
选项设置为 .proto
文件名转换为 PascalCase(帕斯卡命名法)并移除 .
后的形式。例如:
文件
student_record_request.proto
应设置:option java_outer_classname = "StudentRecordRequestProto";
Java 包
生成的绑定的 Java 包将自动设置为 proto 包。但是,这通常不符合 Java 的约定。为确保使用符合约定的 Java 包名,我们建议显式设置 java_package
选项。例如,在 Google 内部,惯例是在 proto 包前加上 com.google.
。
不可变 API 消息名称
protoc 的 Java 插件将根据下表生成名称。
java_multiple_files | java_package | java_outer_classname | 生成的完整消息名称 |
---|---|---|---|
true | 未定义 | 忽略 | com.google.protos.$package.$message |
true | 已定义 | 忽略 | $java_package.$message |
false | 未定义 | 未定义 | com.google.protos.$package.$derived_outer_class.$message |
false | 未定义 | 已定义 | com.google.protos.$package.$java_outer_classname.$message |
false | 已定义 | 未定义 | $java_package.$derived_outer_class.$message |
false | 已定义 | 已定义 | $java_package.$java_outer_classname.$message |
图例
$message
是 proto 消息的实际名称。$package
是 proto 包的名称。这是由 proto 文件中的package
指令指定的名称,通常位于文件顶部。$derived_outer_class
是从 proto 文件名生成的名称。通常,它是通过从文件名中移除标点符号并将其转换为 PascalCase(帕斯卡命名法)来计算的。例如,如果 proto 是foo_bar.proto
,则$derived_outer_class
的值是FooBar
。如果生成的类名与 proto 文件中定义的消息之一相同,则会在
derived_outer_class
后面附加OuterClass
。例如,如果 proto 是foo_bar.proto
并且包含一个FooBar
消息,那么$derived_outer_class
的值是FooBarOuterClass
。当使用 v1 API 时,无论类名是否与定义的消息之一相同,情况也是如此。所有其他的
$names
都是在.proto
文件中定义的相应文件选项的值。