6 JVM API

Java仮想マシン(JVM) APIは、JVMの様々な側面と対話し、制御できるクラスおよびメソッドのセットを提供します。これらのAPIにより、実行時にJVMと対話する方法が提供され、Javaアプリケーションの実行をモニターおよび制御できます。

トピック:

このトピックでは、注意する必要がある新しい重要なAPIについて説明します。

JVM Constants API

JVM Constants APIは、パッケージjava.lang.constants内で定義され、ここには様々なタイプのロード可能定数の名目的記述子が格納されています。これらの名目的記述子は、クラス・ファイルや、コンパイル時またはリンク時のプログラム分析ツールを操作するアプリケーションに有用です。

名目的記述子はロード可能定数の値ではありませんが、その値の記述であり、クラスのロード・コンテキストに基づいて再構成できます。ロード可能定数とは、オペランド・スタックにプッシュしたり、invokedynamic命令のブートストラップ・メソッドの静的引数リストに表示したりできる、定数プール・エントリのことです。オペランド・スタックとは、JVM命令の入力の取得元および出力の格納先のことです。Javaクラス・ファイルごとに定数プールがあり、そこには、コンパイル時に認識される数値リテラルから実行時に解決する必要があるメソッド参照およびフィールド参照まで、様々な種類の定数が格納されています。

Classオブジェクトなど、参照が実行時に解決される非名目的なロード可能定数を使用する場合の問題は、その参照がクラスのロード・コンテキストの正確性と一貫性に依存するという点です。クラスのロードでは、実行したくないコードが実行されたり、アクセス関連やメモリー不足の例外がスローされるなどの悪影響が生じる可能性があります(これらは名目的記述子を使用することで回避できます)。また、クラスのロードがまったく不可能な場合もあります。

パッケージjava.lang.constantを参照してください。

クラス・ファイルAPI

クラス・ファイルAPIは、Javaクラス・ファイルの解析、生成および変換に使用されるパッケージjava.lang.classfileで定義されます。APIは、Java仮想マシン仕様classファイル形式に関する章で定義されているclassファイル形式を追跡するクラス・ファイルを処理します。Java言語および仮想マシン仕様を参照してください。

背景情報は、JEP 484: クラス・ファイルAPIを参照してください。

クラス・ファイルAPIは、次のような重要な原則によって定義されます:
  • フィールド、メソッド、属性、バイトコード命令など、すべてのクラス・ファイル・エンティティを不変オブジェクトとして扱います。この不変の表現により、クラス・ファイルが変換されるときに信頼性の高い共有が保証されます。
  • ツリー構造を使用して、クラス・ファイルの階層的な性質を表します。
  • これにより、ユーザー主導のナビゲーションが可能になり、効率的な解析が可能になります。
  • 解析の遅延を強調し、ユーザーが必要とするクラス・ファイルのみを処理します。
  • クラス・ファイルの解析および生成APIが十分に整列されている場合は、緊急プロパティとして変換されます。これには、独自の特殊モードや重要な新しいAPIサーフェスは必要ありません。

クラス・ファイルAPIには、要素、ビルダーおよび変換という3つの主要な抽象化が組み込まれています: 要素は、クラス・ファイル・コンポーネントの不変の説明です。ビルダーは、特定のビルド・メソッドを使用してクラス・ファイルを構築します。複合要素の種類ごとにビルドがあります。変換は、ビルド・プロセス中に要素を修正する関数を表します。

APIには、パターンを使用してクラス・ファイルを解析するための新しいメソッドも導入されています。これにより、Javaのパターン・マッチング機能を活用して、より直接的で簡潔な式が可能になります。このAPIを使用するフレームワークおよびツールは、最新のJDKのクラス・ファイルを自動的にサポートします。

パッケージjava.lang.classfileを参照してください。