Java 7语言功能与Android

问题:

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

回答:

如果您使用Android Studio,则Java 7 language应该自动启用,无需任何补丁。 Try-with-resource需要API等级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.2IntelliJ IDEA CE和其他基于javac的IDE支持编译为Android and,您可以将合规性设置为Java 8:

  • 文件→项目结构→模块→(在第2窗格中选择模块)→语言级→(选择“7.0 – 钻石,ARM,多抓取”等)

 Enabling Java 7 on IntelliJ
这只允许Java 7 语言特征,并且您几乎不会从图书馆获得改进,因此几乎不会受益。您可以使用的功能是不依赖于库的功能:

  • 钻石经营者(<>
  • 字符串开关
  • 多重捕获(catch (Exc1 | Exc2 e)
  • 数字字面值(1_234_567)中的下划线
  • 二进制文字(0b1110111

这些功能无法使用yet

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

…“但”:)事实证明,虽然Android的图书​​馆的目标是1.6,Android的源码确实包含像AutoCloseableCloseable之类的传统接口从继承自动关闭(SafeVarargs真的是失踪) 。我们可以通过反思确认它的存在。它们被隐藏,因为Javadoc具有@hide标签,这导致“android.jar”不包含它们。
已经有了关于如何使这些方法恢复的问题 。您只需要使用我们自定义的replace当前平台的现有“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()(但without .getNumericCode())
  •  BitSet:.previousSetBit(),.previousClearBit(),.valueOf(),.toLongArray(),.toByteArray()
  •  Collections:.emptyEnumeration(),.emptyIterator(),.emptyListIterator()
  •  AutoCloseable
  •  Throwable:.addSuppressed(),.getSuppressed()和4参数构造函数
  •  Character:.compare(),.isSurrogate(),.getName(),.highSurrogate(),.lowSurrogate(),.isBmpCodePoint()(但without .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。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Java 7 language features with Android

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 7 = 1