Android での Java 7 言語機能 質問する

Android での Java 7 言語機能 質問する

Android で新しい Java 7 言語機能を使用したことがある人はいるでしょうか? Android は Java が吐き出すバイトコードを読み取って dex に変換することは知っています。そこで、質問したいのは、Android が Java 7 のバイトコードを理解できるかどうかです。

ベストアンサー1

使用している場合アンドロイドスタジオ、Java 7言語パッチなしで自動的に有効になるはずです。try-with-resource には API レベル 19 以上が必要で、NIO 2.0 の機能が不足しています。

Java 7の機能を使用できない場合は、ヌーノの編集方法に関する回答build.gradle

以下は歴史的な興味のためだけのものです。


Java 7 のごく一部は Android でも使用できます (注: 4.1 でのみテストしました)。

まず、EclipseのADTは使えません。ハードコードされているJava コンパイラ 1.5 と 1.6 のみが準拠しています。ADT を再コンパイルすることもできますが、Android 全体を再コンパイルする以外に簡単な方法はないようです。

しかしEclipseを使う必要はありません。例えば、Android Studio 0.3.2IntelliJ IDEA CEその他のJavaベースのIDEはAndroidへのコンパイルをサポートしているそして次のようにして、Java 8 までの準拠を設定できます。

  • ファイル → プロジェクト構造 → モジュール → (2 番目のペインでモジュールを選択) → 言語レベル → (「7.0 - Diamonds、ARM、マルチキャッチなど」を選択)

IntelliJ で Java 7 を有効にする

これはJava 7のみを許可します言語機能改善の半分もライブラリから得られるため、ほとんど何もメリットがありません。使用できる機能は、ライブラリに依存しない機能です。

  • ダイヤモンド演算子 ( <>)
  • 文字列スイッチ
  • 複数キャッチ(catch (Exc1 | Exc2 e)
  • 数値リテラル内のアンダースコア ( 1_234_567)
  • バイナリリテラル ( 0b1110111)

これらの機能は使用できませんまだ:

  • -with-resourcesステートメントtry— 存在しないインターフェース「java.lang.AutoCloseable」を必要とするため (これは 4.4 以降でパブリックに使用できます)
  • @SafeVarargs アノテーション — 「java.lang.SafeVarargs」が存在しないため

...「まだ」:) Androidのライブラリは1.6をターゲットにしていますが、Androidのソースには次のようなインターフェースが含まれています。自動クローズ可能従来のインターフェース閉じることができるAutoCloseable から継承されます (ただし、SafeVarargs は実際には存在しません)。リフレクションによってその存在を確認できました。これらは、Javadoc にタグがあるために非表示になっており@hide、"android.jar" に含まれません。

すでに存在する質問 隠し API と内部 API を利用できる Android SDK をビルドするにはどうすればよいですか? これらのメソッドを復元する方法については、交換する現在のプラットフォームの既存の「android.jar」参照をカスタマイズされたものと置き換えると、Java 7 API の多くが利用できるようになります (手順は Eclipse の場合と同様です。プロジェクト構造 → SDK を確認してください)。

AutoCloseableに加えて、次のJava 7のみライブラリ機能以下も明らかになった。

基本的にはこれですべてです。特に、NIO 2.0 は存在せず、Arrays.asList はまだ @SafeVarargs ではありません。

おすすめ記事