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

名称映射

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

遗憾的是,采用驼峰命名法的软件包名称可能会降低所生成代码的可读性, 使用较长的软件包名称例如,Google Guava 的 Beta 版注释com.google.common.annotations 软件包中,而 ComGoogleCommonAnnotationsBeta 更难 比Beta高。

定义软件包前缀

定义非正式命名空间的 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 文件”参数:

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 的文件 包含用于翻译的前缀的 bundle,Class.forName(javaName) 将找到映射的类。

要将上述 prefixes.properties 添加到 Xcode 中的 iOS 应用,请打开构建目标的“Build Phases” 标签页,展开其“Copy Bundle Resources”部分,然后将 prefixes.properties 文件添加到该列表。 Java 资源详细介绍了 Java 资源概念如何映射到 iOS 资源。