- 前川喜洋
- 約 2,500 文字
- 400 View
目次
- はじめに
- JEP 484: Class-File API (クラスファイルを解析、生成、変換するための標準API)
- JEP 485: Stream Gatherers (Streamでより柔軟な中間操作を可能にするgatherメソッド)
- JEP 478: Key Derivation Function API (鍵導出関数のためのAPI)
- JEP 472: Prepare to Restrict the Use of JNI (JNIの安全でない使用を制限)
- JEP 486: Permanently Disable the Security Manager (セキュリティマネージャを恒久的に無効化)
- JEP 496 & 497: Quantum-Resistant (量子コンピュータによる攻撃に耐性)
- JEP 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe (sun.misc.Unsafeのメモリ操作メソッド使用時に警告)
- おわりに
はじめに
コアテクノロジーグループの前川です。
Java25リリース連載 1本目の記事です。
今回はJDK 24でのアップデート内容から以下についてピックアップしてご紹介します。
- API系
- セキュリティ系
- JEP 472: Prepare to Restrict the Use of JNI (JNIの安全でない使用を制限)
- JEP 486: Permanently Disable the Security Manager (セキュリティマネージャを恒久的に無効化)
- JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism (量子コンピュータによる攻撃に耐性)
- JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm (量子コンピュータによる攻撃に耐性)
- JEP 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe (sun.misc.Unsafeのメモリ操作メソッド使用時に警告)
JEP 484: Class-File API (クラスファイルを解析、生成、変換するための標準API)
Java バイトコードを読み込んでクラスファイルを解析、生成、変換するための機能を公式に提供するためのライブラリとしては、ASM や BCEL などが広く使われていますが、これらは JDK の一部ではなく、外部ライブラリとしてプロジェクトに組み込む必要があります。JEP 484 では、こうした外部ライブラリに依存せずに、JDK 標準でクラスファイルを解析、生成、変換するための API を提供します。 JDK 22から2回のプレビューを経て正式リリースとなりました。
以下は ClassBuilder を使用して既存のクラスのメソッド冒頭に System.out.println を仕込んで新クラスのclassファイルを作成するサンプルです。
import java.lang.classfile.*; |
public class MyTargetClass { |
javac *.java |
考え方としてはASMに近いですが記法が異なっていて、ASMがビジターパターンなのに対してこちらはビルダーの多層構造になっており、 OpenRewrite 等でサクッと移行というわけにはいかなさそうです。
JEP 485: Stream Gatherers (Streamでより柔軟な中間操作を可能にするgatherメソッド)
Streamパイプラインの中に、自由度の高いカスタム中間操作を組み込むことを可能にします。これにより、開発者はこれまで以上に柔軟かつ直観的にデータ処理を記述できるようになります。
Collector で頑張ろうとすると一旦「Stream脳」から離れないといけなかったのがかなり軽減されます。 Integrator の state 、遂に来たかという感じですね。
import java.util.ArrayList; |
JEP 478: Key Derivation Function API (鍵導出関数のためのAPI)
ポスト量子暗号(PQC)対応の一環。
鍵導出関数(KDF)をひとことで言うと、 「鍵の”おおもと”(マスターキーやパスワード)から、用途に合わせて安全な”子鍵”を複数生成するための仕組み」 です。これまでJavaには鍵を導出する為の統一的な標準APIが有りませんでした。この状況を改善し、標準化と相互運用性を高めてよりモダンで堅牢なアルゴリズムの利用を促進する事を目的として導入されたのが javax.crypto.KDF クラスです。
例はJEPのページからそのまま抜粋しますが以下のコードにより javax.crypto.SecretKey オブジェクトを生成できます。 SecretKey オブジェクトは従来と同様に Cipher クラスなどで利用できます。
// Create a KDF object for the specified algorithm |
バージョン24時点ではPreviewなので、コンパイル時と実行時に以下のオプションを指定する必要があります。
javac --release 24 --enable-preview Foo.java |
JEP 472: Prepare to Restrict the Use of JNI (JNIの安全でない使用を制限)
このJEPは、Java Native Interface の安全でない使用を将来的に制限するための準備です。ネイティブコードがJVMの整合性を損なう可能性のあるJNI関数を呼び出した際に、デフォルトで警告が表示されるようになりました。
JEP 486: Permanently Disable the Security Manager (セキュリティマネージャを恒久的に無効化)
Java 17で非推奨となっていたセキュリティマネージャが、このバージョンでデフォルトで無効化されました。まだ完全な削除ではなく、コマンドラインオプションで有効化できます。
JEP 496 & 497: Quantum-Resistant (量子コンピュータによる攻撃に耐性)
これら2つのJEPは、将来の量子コンピュータによる攻撃に耐えうる暗号技術を導入するものです。JEP 496では暗号通信のための鍵カプセル化メカニズム、JEP 497ではデジタル署名アルゴリズムが実装されました。
JEP 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe (sun.misc.Unsafeのメモリ操作メソッド使用時に警告)
sun.misc.Unsafe クラス内の特定のメモリ操作メソッドが使用された際に、警告が発せられるようになりました。これらのメソッドはJVMを不安定にするリスクがあるため、開発者には公式にサポートされている安全なAPIへの移行が推奨されています。
おわりに
「ポスト量子」の世界がいよいよ現実味を増してきましたね。
次回は引続きJDK 24のご紹介が続きます。