Java Proto 名称

由 Java protoc 插件生成的名称。

本文档包含关于 proto 的完全限定 Java 名称是什么的信息,基于不同的 proto 选项。此名称对应于您需要导入以使用该消息的包。

建议

  • 设置 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 选项为转换为 PascalCase 且移除了 '.'.proto 文件名。例如

  • 文件 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_filesjava_packagejava_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 文件中定义的相应文件选项的值。