Android 的 Java 7 语言特性

标签 java android bytecode java-7

只是想知道是否有人尝试过在 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:

  • 文件→项目结构→模块→(在第二个 Pane 中选择模块)→语言级别→(选择“7.0 - Diamonds、ARM、multi-catch等”)

  • Enabling Java 7 on IntelliJ

    这仅允许 Java 7 语言特性 ,并且您几乎无法从任何东西中受益,因为一半的改进也来自库。您可以使用的功能是那些不依赖于库的功能:
  • 菱形运算符 ( <> )
  • 字符串开关
  • 多次捕获 ( catch (Exc1 | Exc2 e) )
  • 数字文字中的下划线 ( 1_234_567 )
  • 二进制文字 ( 0b1110111 )

  • 这些功能还不能使用:
  • try -with-resources 语句——因为它需要不存在的接口(interface)“java.lang.AutoCloseable”(这可以在 4.4+ 中公开使用)
  • @SafeVarargs 注释——因为“java.lang.SafeVarargs”不存在

  • ... “还” :) 事实证明,虽然 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 库功能还透露:
  • ConcurrentModificationException、LinkageError 和 AssertionError 中的异常链构造函数
  • 基元的静态 .compare() 方法:Boolean.compare()、Byte.compare()、Short.compare()、Character.compare()、Integer.compare()、Long.compare()。
  • Currency : .getAvailableCurrencies(), .getDisplayName()(但没有 .getNumericCode())
  • BitSet : .previousSetBit(), .previousClearBit(), .valueOf(), .toLongArray(), .toByteArray()
  • Collections : .emptyEnumeration(), .emptyIterator(), .emptyListIterator()
  • AutoCloseable
  • Throwable : .addSuppressed()、.getSuppressed() 和 4 参数构造函数
  • Character : .compare(), .isSurrogate(), .getName(), .highSurrogate(), .lowSurrogate(), .isBmpCodePoint()(但没有 .isAlphabetic() 和 .isIdeographic())
  • 系统:.lineSeparator()(未记录?)
  • java.lang.reflect.Modifier : .classModifiers(), .constructorModifiers(), .fieldModifiers(), .interfaceModifiers(), .methodModifiers()
  • NetworkInterface : .getIndex(), .getByIndex()
  • InetSocketAddress : .getHostString()
  • InetAddress : .getLoopbackAddress()
  • Logger : .getGlobal()
  • ConcurrentLinkedDeque
  • AbstractQueuedSynchronizer : .hasQueuedPredecessors()
  • DeflaterOutputStream :带有“syncFlush”的 3 个构造函数。
  • Deflater : .NO_FLUSH, .SYNC_FLUSH, .FULL_FLUSH, .deflate() 带 4 个参数

  • 这基本上就是全部。特别是,NIO 2.0 不存在,Arrays.asList 仍然不是@SafeVarargs。

    关于Android 的 Java 7 语言特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153989/

    相关文章:

    java - 通过 JDBC 驱动程序从 SQL 过程到 Java 的信息/警告消息

    android - Google Cloud Test Lab 是否支持 Appium 测试?

    android - 导出连接到 MySQL 数据库的 Android 应用程序

    android - Android ANR 日志中的 "faults"是什么意思?

    java.lang.VerifyError : Bad type on operand stack in method com. sun.net.httpserver.spi.HttpServerProvider 错误

    自定义 Lua 字节码解释器的 LuaJIT 与 luac

    java - 在接口(interface)的常量池中包含 java.lang.Object 的目的是什么?

    java - 查找有关 Eclipse 插件的执行上下文信息

    java - Java中如何传递泛型类型的Class变量?

    java - android java.lang.NoClassDefFoundError : org. bouncycaSTLe.crypto.engines.AESEngine api 16