小编典典

Android 的 Java 7 语言功能

all

只是想知道是否有人尝试在 Android 中使用新的 Java 7
语言功能?我知道Android会读取Java吐出的字节码并将其转换为dex。所以我想我的问题是它可以理解 Java 7 的字节码吗?


阅读 67

收藏
2022-07-28

共1个答案

小编典典

如果您使用的是 Android Studio ,则应自动启用Java 7 语言,无需任何补丁。 Try-with-resource 需要 API
级别 19+,并且缺少 NIO 2.0 的东西。

以下仅出于历史兴趣。


Java 7 的一小部分当然可以与 Android 一起使用(注意:我只在 4.1 上测试过)。

首先,您不能使用 Eclipse 的
ADT,因为它是硬编码的,只有
Java 编译器 1.5 和 1.6 是兼容的。您可以重新编译 ADT,但我发现除了一起重新编译整个 Android 之外,没有简单的方法可以做到这一点。

但是您不需要使用 Eclipse。例如, Android Studio
0.3.2

IntelliJ IDEA CE
和其他基于 javac 的 IDE 支持编译到
Android 您甚至可以将合规性设置为 Java 8:

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

在 IntelliJ 上启用 Java 7

这仅允许 Java 7 语言功能 ,并且您几乎无法从任何东西中受益,因为一半的改进也来自该库。您可以使用的功能是那些不依赖于库的功能:

  • 钻石算子 ( <>)
  • 字符串开关
  • 多次捕获 ( catch (Exc1 | Exc2 e))
  • 数字文字中的下划线 ( 1_234_567)
  • 二进制字面量 ( 0b1110111)

这些功能还 不能使用:

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

…“还”:) 事实证明,尽管 Android 的库针对 1.6,但 Android
源代码确实包含AutoCloseable等接口,而Closeable等传统接口确实继承自
AutoCloseable(不过,确实缺少 SafeVarargs)。我们可以通过反射来确认它的存在。它们被隐藏只是因为 Javadoc
@hide标签,这导致“android.jar”不包含它们。

已经存在一个问题 如何构建具有隐藏和内部 API 的 Android
SDK?

关于如何取回这些方法。您只需要将当前平台已有的“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()。
  • 货币:.getAvailableCurrencies()、.getDisplayName()(但 没有.getNumericCode())
  • 位集: .previousSetBit ()、.previousClearBit()、.valueOf()、.toLongArray()、.toByteArray()
  • 集合:.emptyEnumeration()、.emptyIterator()、.emptyListIterator()
  • 自动关闭
  • Throwable:.addSuppressed()、.getSuppressed() 和 4 参数构造函数
  • 字符:.compare()、.isSurrogate()、.getName()、.highSurrogate()、.lowSurrogate()、.isBmpCodePoint()(但 没有.isAlphabetic() 和 .isIdeographic())
  • 系统:.lineSeparator()(未记录?)
  • java.lang.reflect.Modifier:.classModifiers()、.constructorModifiers()、.fieldModifiers()、.interfaceModifiers()、.methodModifiers()
  • 网络接口: .getIndex ()、.getByIndex()
  • InetSocketAddress : .getHostString()
  • InetAddress : .getLoopbackAddress()
  • 记录器:.getGlobal()
  • 并发链接双端队列
  • AbstractQueuedSynchronizer : .hasQueuedPredecessors()
  • DeflaterOutputStream:带有“syncFlush”的 3 个构造函数。
  • 放气机: .NO_FLUSH、.SYNC_FLUSH、.FULL_FLUSH、.deflate() 带 4 个参数

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

2022-07-28