小编典典

Android的Java 7语言功能

java

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


阅读 435

收藏
2020-03-11

共1个答案

小编典典

如果你使用的是Android Studio,则应自动启用Java 7 语言,而无需任何补丁。尝试资源要求API级别为19+,并且缺少NIO 2.0。

如果你无法使用Java 7功能,请参阅@Nuno关于如何编辑的答案build.gradle

以下内容仅出于历史目的。

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 语言功能,并且你几乎无法从中受益,因为一半的改进也来自库。你可以使用的功能是那些不依赖于库的功能:

  • Diamond operator (<>)
  • String switch
  • Multiple-catch (catch (Exc1 | Exc2 e))
  • Underscore in number literals (1_234_567)
  • Binary literals (0b1110111)

  • 该try-with-resources语句-因为它需要非现有的接口“java.lang.AutoCloseable”(这个可以公开在4.4或以上版本使用)

  • @SafeVarargs批注-因为“ java.lang.SafeVarargs”不存在
    …“ yet” :)事实证明,尽管Android库的目标是1.6,但Android源代码确实包含AutoCloseable之类的接口,而像Closeable这样的传统接口确实继承自AutoCloseable(尽管确实缺少SafeVarargs)。我们可以通过反思来确认它的存在。它们之所以被隐藏仅仅是因为Javadoc具有@hide标记,从而导致“ android.jar”不包含它们。

已经存在一个问题,如何使用隐藏的和内部的API构建Android SDK?关于如何找回这些方法的知识。你只需要用我们自定义的平台替换当前平台的现有“ android.jar”引用,那么许多Java 7 API都将可用(该过程类似于Eclipse中的过程。请检​​查项目结构→SDK。)

除了自动关闭功能之外,(仅)还显示了以下Java 7 库功能:

  • ConcurrentModificationException,LinkageError和AssertionError中的异常链接构造函数
  • 用于基元的静态.compare()方法:Boolean.compare(),Byte.compare(),Short.compare(),Character.compare(),Integer.compare(),Long.compare()。
  • 货币:.getAvailableCurrencies()、. getDisplayName()(但不带 .getNumericCode())
  • BitSet:.previousSetBit()、. previousClearBit()、. valueOf()、. toLongArray()、. toByteArray()
  • 集合:.emptyEnumeration()、. emptyIterator()、. emptyListIterator()
  • 自动关闭
  • Throwable:.addSuppressed()、. getSuppressed()和四参数构造函数
  • 字符:.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()
  • 记录器:.getGlobal()
  • 并发链接双端队列
  • AbstractQueuedSynchronizer:.hasQueuedPredecessors()
  • DeflaterOutputStream:3个带有“ syncFlush”的构造函数。
  • Deflater:.NO_FLUSH,.SYNC_FLUSH,.FULL_FLUSH,.deflate()用4个参数
    基本上就是全部。特别是,NIO 2.0不存在,并且Arrays.asList仍然不是@SafeVarargs。
2020-03-11