1. ホーム
  2. java

[解決済み] Androidで実現するJava 7の言語機能

2022-04-14 14:23:13

質問

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

どのように解決するのですか?

を使用している場合 Android Studio の場合、Java 7 言語 はパッチ無しで自動的に有効になるはずです。Try-with-resourceはAPI Level 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.2 , IntelliJ IDEA CE およびその他の javac ベースの IDE は、Android へのコンパイルをサポートしています。 でJava 8まで対応させることも可能です。

  • ファイル → プロジェクト構造 → モジュール → (2番目のペインでモジュールを選択) → 言語レベル → ("7.0 - Diamonds, ARM, multi-catch, etc." を選択)

これは、Java 7のみを許可しています 言語機能 というのも、改良の半分くらいはライブラリから来るものだからです。使える機能は、ライブラリに依存しない機能です。

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

また、これらの機能は使用できません なお :

  • try -with-resources ステートメント - 存在しないインターフェイス "java.lang.AutoCloseable" を必要とするため (これは 4.4+ で公に使用することができます)
  • SafeVargs アノテーション - "java.lang.SafeVargs" が存在しないため。

... "まだ" :) Android のライブラリは 1.6 をターゲットにしていますが、Android のソースには以下のようなインターフェイスがあることがわかりました。 オートクローズ可能 のような従来のインターフェースと クローズ可能 は AutoCloseable を継承しています (SafeVarargs は本当に欠落していますが)。リフレクションでその存在を確認することができた。隠されているのは、単にJavadocに @hide というタグがあり、それが原因で "android.jar" はそれらを含んでいませんでした。

すでに既存の質問として 隠しAPIや内部APIが利用可能なAndroid SDKを構築するにはどうすればよいですか? これらのメソッドを取り戻す方法について。必要なのは 置き換える をカスタマイズしたものに変更すると、多くのJava 7 APIが利用可能になります(手順はEclipseと同様です)。プロジェクト構造 → SDKsをチェックしてください)。

AutoCloseable に加えて、(唯一)以下の Java 7 ライブラリ機能 も公開されています。

基本的には以上です。特に、NIO 2.0は存在しませんし、Arrays.asListはまだ@SafeVargsではありません。