Oracle が Java 9 で削除すると、Spring や他の多くの一般的なライブラリが壊れることをここで読みましたsun.misc.Unsafe
。ただし、Spring または Hibernate には、このクラスへの静的参照はありません。それで、その主張は本当ですか?
ところで、Java 8には64の参照がありUnsafe
ますが、Oracleがそのクラスを削除すると、それらすべてが更新され、ライブラリは影響を受けません(Unsafe
直接使用しない限り)。
Mark Reinhold は、JVM Language Summit 2015で、sun.misc.Unsafe の秘密の歴史と悲劇的な運命というタイトルの講演を行いました。これらの講演には多くの免責事項がありますが、 JEP260で説明されている提案されたアプローチを10:23で見ることができます。
一般的な考え方は次のとおりです。
Unsafe
API を非推奨にする以下は、JEP260 からの関連テキストです (2015 年 10 月 20 日から取得)。
JDK 9 では、次のことを提案しています。
重要でないすべての内部 API をデフォルトでカプセル化する: それらを定義するモジュールは、外部で使用するためにパッケージをエクスポートしません。(そのような API へのアクセスは、最後の手段として、コンパイル時と実行時の両方でコマンドライン フラグを介して利用できます。ただし、これらの API が他の理由で改訂または削除されない限り)。
サポートされている置換が JDK 8 に存在する重要な内部 API を、同じ方法で同じ最後の手段の回避策でカプセル化します。(サポートされている代替は、Java SE 8 標準の一部 (つまり、java.* または javax.* パッケージ内) または JDK 固有で @jdk.Exported で注釈が付けられたもの (通常は com.sun. * または jdk.* パッケージ))
サポートされている代替がJDK 8に存在しない重要な内部APIをカプセル化しないでください。さらに、JDK 9でサポートされている代替を、JDK 10でカプセル化するか、場合によっては削除することを意図して非推奨にします。
...
JDK 9 で置換が導入された重要な内部 API は、JDK 9 で非推奨になり、JDK 10 でカプセル化または削除されます。
このリソースは、JDK 9 とその機能の現在のステータスを正しく理解するのに役立ちます。コミュニティは、Unsafe とその将来、Java の将来に関連する議論を開始しました。与えられたドキュメントは、一部の内部 API を非表示にしながら一部の重要な API にアクセス可能なままにすることを提案するJEP-260に対応するためのコミュニティの取り組みです。ドキュメント自体からの抜粋:
JDK 9 で引き続きアクセスできることが提案されている重要な内部 API は次のとおりです。
sun.misc.Cleaner
sun.misc.{Signal,SignalHandler}
sun.misc.Unsafe (このクラスの多くのメソッドの機能は、変数ハンドルを介して利用できるようになりました (JEP 193))。
sun.reflect.Reflection::getCallerClass (このメソッドの機能は、JEP 259 を介して標準形式で提供される場合があります。)
sun.reflect.ReflectionFactory
したがって、少なくとも指定された JEP に基づいて、 Unsafe のままにする必要があります。
おそらく、参照はSpringまたはHibernateのコアではなく、別の場所にあります。リンクされたドキュメントはSpringに関して述べています
Spring Framework (Objenesis 経由、フォールバックあり)
現在取り組んでいるプロジェクトで Unsafe の使用法を検索しようとしましたが、壊れる可能性のあるライブラリがまだかなりあります。
クイック検索の結果:
答えはリンク先のドキュメントにあります。Spring は に直接依存していませんが、Unsafe
Spring は Objenesis に依存し、Objenesis は に依存していUnsafe
ます。
Objenesis の依存関係Unsafe
: https://github.com/easymock/objenesis/blob/master/main/src/main/java/org/objenesis/instantiator/sun/UnsafeFactoryInstantiator.java
Spring の Objenesis への依存は、それ自体が少し奇妙です。Spring のビルド スクリプトは Objenesis バイナリを取得し、JarJar ツールを使用してバイトコード レベルの変更を行います。次のビルド スクリプトでその機能を確認できます。 .
これは基本的に、Spring の「spring-core」バイナリが org.springframework.objenesis.* パッケージ構造の下に多数のクラスを含むことになることを意味しますが、これらのクラスはもともと Objenesis GitHub のソースに格納され、Objenesis チームによってバイナリとして公開されました。 、Spring のビルド中にフェッチされ、org.springframework.* パッケージに再パッケージ化されてから、Spring の一部として再公開されます。そのため、それらを見つけるのに苦労しています。
Spring はUnsafe
(Objenesis を介して) を使用して、最初にコンストラクターを呼び出さずにクラスを作成します。