如何为软件包名称指定前缀。

名称映射

Java 使用软件包非正式地定义命名空间;而 Objective C++ 具有 C++ 命名空间,而 Objective C 则没有。为了在使用多个软件包中的类时保持名称的唯一性,J2ObjC 会在类型名称前附加一个驼峰式大小写的软件包版本。例如,java.util.Map 已重命名为 JavaUtilMap

遗憾的是,采用驼峰式大小写的软件包名称会降低所生成的代码的可读性,尤其是对于较长的软件包名称。例如,Google Guava 的 Beta 版注释位于 com.google.common.annotations 软件包中,并且 ComGoogleCommonAnnotationsBetaBeta 更难读。

定义软件包前缀

定义非正式命名空间的 Objective-C 惯例是使用共享前缀,通常是两个大写字母。例如,iOS 基础框架使用“NS”(来自 NeXTStep)。为了简化 Google Guava 的 Beta 版名称,前缀(例如“GG”)将 Beta 称为 GGBeta,以提高可读性。

J2ObjC 支持开发者自行指定前缀来映射到软件包名称。这在命令行中使用 --prefix package=prefix 完成。为缩短 Beta 软件包中的所有类名称,需使用“--prefix com.google.common.annotations=GG”。每个软件包都需要单独的前缀声明。

为多个软件包定义单个前缀

较小的库通常具有不冲突的 Java 类名称,因此可以使用带通配符的软件包规范共享单个前缀。例如,所有 Joda-Time 软件包均可使用 --prefix 'org.joda.time.*=JT' 共享同一 JT 前缀。唯一支持的通配符是“*”,它与命令行 shell 处理文件名的方式相同。

定义多个软件包前缀

为了简化指定多个前缀定义,可以将属性文件与“--prefixes file”参数配合使用:

cat prefixes.properties
com.google.common.annotations: GG
com.google.common.base: GG

# While GG can be used for all packages, let's mix it up.
com.google.common.collect: GC
com.google.common.io: GIO        # A prefix can be more than two characters,
com.google.common.net: GuavaNet  # a lot more!
...
j2objc --prefixes prefixes.properties <args>

在运行时添加前缀的类

由于完成后的应用具有带前缀的类,因此默认情况下,系统无法使用原始 Java 类名称找到它们。不过,如果应用的资源包中名为 prefixes.properties 的文件带有用于翻译的前缀,Class.forName(javaName) 将会找到映射的类。

如需在 Xcode 中将上述 prefixes.properties 添加到 iOS 应用,请打开 build 目标的“Build Phases”标签页,展开其“Copy Bundle Resources”部分,然后将 前缀 es.properties 文件添加到该列表中。如需详细了解 Java 资源概念如何映射到 iOS 资源,请参阅 Java 资源