草庐IT

Android 的 Java 7 语言特性

coder 2023-04-26 原文

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



  • 这仅允许 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/

    有关Android 的 Java 7 语言特性的更多相关文章

    1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    2. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    3. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

      几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

    4. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    5. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

      ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

    8. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

      这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

    9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

      HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

    10. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

      嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

    随机推荐