只是想知道是否有人尝试过在 Android 中使用新的 Java 7 语言功能?
我知道Android读取Java吐出的字节码并将其转换为dex。所以我想我的问题是它可以理解 Java 7 的字节码吗?
最佳答案
如果您正在使用 Android Studio ,Java 7 语言应自动启用,无需任何补丁。 Try-with-resource 需要 API Level 19+,并且缺少 NIO 2.0 的东西。
如果您不能使用 Java 7 功能,请参阅 @Nuno关于如何编辑您的 build.gradle
的回答.
以下内容仅供历史兴趣。
Java 7 的一小部分当然可以与 Android 一起使用(注意:我只在 4.1 上测试过)。
首先,您不能使用 Eclipse 的 ADT,因为 it is hard-coded只有 Java 编译器 1.5 和 1.6 兼容。您可以重新编译 ADT,但我发现除了重新编译整个 Android 之外,没有其他简单的方法可以做到这一点。
但是您不需要使用 Eclipse。例如,Android Studio 0.3.2 , IntelliJ IDEA CE和其他基于 javac 的 IDE 支持编译到 Android,您甚至可以将合规性设置为 Java 8:
这仅允许 Java 7 语言特性 ,并且您几乎无法从任何东西中受益,因为一半的改进也来自库。您可以使用的功能是那些不依赖于库的功能:
<>
) catch (Exc1 | Exc2 e)
) 1_234_567
) 0b1110111
) 这些功能还不能使用:
try
-with-resources 语句——因为它需要不存在的接口(interface)“java.lang.AutoCloseable”(这可以在 4.4+ 中公开使用)... “还” :) 事实证明,虽然 Android 的库针对 1.6,但 Android 源代码确实包含类似 AutoCloseable 的接口(interface)。和传统接口(interface),如 Closeable确实从 AutoCloseable 继承(尽管确实缺少 SafeVarargs)。我们可以通过反射来确认它的存在。它们被隐藏只是因为 Javadoc 有
@hide
标签,导致“android.jar”不包含它们。已经存在问题 How do I build the Android SDK with hidden and internal APIs available? 关于如何取回这些方法。您只需将当前平台现有的“android.jar”引用替换为我们自定义的引用,然后许多 Java 7 API 将可用(该过程与 Eclipse 中的类似。检查项目结构 → SDK。)
除了 AutoCloseable 之外,(仅)以下 Java 7 库功能还透露:
这基本上就是全部。特别是,NIO 2.0 不存在,Arrays.asList 仍然不是@SafeVarargs。
关于Android 的 Java 7 语言特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153989/