名称映射
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 资源。