8

我在 Guice 的下载页面上看到了一个名为 guice-no-aop 的模块,其目的显然是针对 Android 开发者进行营销。一些在线搜索拉回了像 RoboGuice 这样的库,它们看起来像是在做类似的基于 AOP 的 IoC,还有几篇文章甚至给出了很好的代码示例。

但我的问题是:如果没有这些特殊库,为什么 Guice 不能在 Android 应用程序上运行?我期待在 Guice 的网站/wiki 上找到一些东西,但令我惊讶的是,找不到一个单一的原因。

有人知道吗?

编辑
这个问题的辅助是一个更广泛的问题:

  • 还有哪些其他 Java 框架不能在 Android 上运行?!?!(经验法则是什么?)
4

3 回答 3

3

AOP 将在运行时进行字节码编织。Android 上的 Dalvik 机器不运行直接的 JVM 字节码。他们运行它的翻译版本。我使用并喜欢名为 roboguice 的 Android 版本的 Guice。http://code.google.com/p/roboguice/ 它不执行任何 AOP,并且您的活动继承自一个名为 RoboActivity 的 RoboGuice 活动,该活动根据当时活动的生命周期进行实际注入。

PS 大多数模拟框架也会生成字节码,并且不会工作或不能完全工作。

于 2012-02-28T20:19:59.863 回答
3

看看这里的比较表。它适用于 Guice 2.0 和 1.0,但它仍应适用于 Guice 3。

带 AOP 和不带 AOP 的 Guice 之间的主要功能区别在于方法拦截器。根据您在方法上使用的注解,即您在 guice 中为处理注解而绑定的内容,guice 将在运行时生成代码来执行您想要的操作。这是 Guice 在 Android 上无法执行的运行时代码生成,因为(还)没有 API 用于动态生成 dalvik 字节码。

于 2012-02-28T20:21:06.713 回答
3

此页面列出了一些不受支持的标准包。任何依赖这些软件包的东西都可能不起作用......

不支持这些包通常是 Java 2 平台标准版的一部分,不受 Android 支持。

  • java.applet
  • java.awt
  • java.beans
  • java.lang.management
  • java.rmi
  • javax.可访问性
  • javax.activity
  • javax.imageio
  • javax.管理
  • javax.命名
  • javax.print
  • javax.rmi
  • javax.security.auth.kerberos
  • javax.security.auth.spi
  • javax.security.sasl
  • javax.swing
  • javax.transaction javax.xml(javax.xml.parsers 除外)
  • org.ietf.*
  • org.omg.*
  • org.w3c.dom.*(子包)

同样正如已经指出的那样,在运行时依赖字节码编织的 AOP 将不起作用(并非所有都可以,例如Spring AOP)。

于 2012-02-28T20:21:14.733 回答