リフレクションと設定
動的機能に対応します。
「リフレクションと設定」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
リフレクションと設定
native-imageのクローズドワールド解析で認識できるのは、静的に追跡できるコードだけです。リフレクション、プロキシ、リソース、シリアライズなどの動的機能は、解析器から対象を隠してしまいます。このレッスンでは、これらをネイティブバイナリで動作させる方法を説明します。
リフレクションの問題
文字列からクラス名を使ってクラスを検索する場合、解析器にはどのクラスを意味しているのか分かりません。そのクラスに他の経路から到達できなければ、イメージから除外され、実行時の検索に失敗します。
public class Main {
public static void main(String[] args) throws Exception {
String name = "java.util.ArrayList"; // could come from config
Class<?> c = Class.forName(name);
System.out.println("Loaded: " + c.getSimpleName());
}
}到達可能性メタデータ
解決策は到達可能性メタデータです。これは、どのクラス、メソッド、フィールドに動的にアクセスするかをnative-imageに伝えるJSONファイルです。ビルド時にそれらが保持され、メンバーも記録されます。
reflect-config.json
リフレクションのエントリには、クラス名と保持するメンバーを指定します。このスニペットはJavaではなくJSONであり、META-INF/native-image/の下に配置します。
[
{
"name": "com.example.Person",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"fields": [ { "name": "age" } ]
}
]トレーシングエージェント
メタデータを手作業で書くのは面倒です。トレーシングエージェント(-agentlib:native-image-agent=config-output-dir=...)を使ってJVM上でアプリケーションを実行してください。実際の実行中に発生した動的アクセスをすべて記録し、設定ファイルを自動的に生成します。
コードパスを実行する
エージェントが記録するのは実際に実行されたものだけなので、アプリケーションのすべての機能を動かす必要があります。エージェントを付けてテストを実行してください。見落としたリフレクションの経路はメタデータに含まれず、ネイティブビルドで問題を引き起こします。
動的プロキシ
JDKの動的プロキシには、プロキシ化されるインターフェースの組み合わせを列挙したproxy-config.jsonが必要です。インターフェースの一覧は実行時に組み立てられるため、解析器が推測することはできません。
リソース
getResourceAsStreamで読み込むファイルは自動的には埋め込まれません。globパターンを記述したresource-config.jsonによって、実行ファイルに組み込むリソースをnative-imageに伝えます。
public class Main {
public static void main(String[] args) {
var url = Main.class.getResource("/banner.txt");
System.out.println("Resource present: " + (url != null));
}
}シリアライズとJNI
Javaのシリアライズとネイティブ(JNI)呼び出しも動的機能です。それぞれに専用の設定ファイル(serialization-config.json、jni-config.json)があります。これらの経路が実行されれば、トレーシングエージェントが設定ファイルも生成します。
プログラムによる登録
ライブラリの作成者は、ビルド時に実行されるRuntimeReflection APIを通じて、Featureを使ってコード内にメタデータを登録できます。これにより正しい設定をライブラリ内部に組み込めるため、利用者が手動で設定する必要はありません。
共有メタデータリポジトリ
GraalVMは、人気のあるライブラリ向けの構築済み設定を収録したコミュニティ到達可能性メタデータリポジトリを管理しています。ネイティブビルドツールはこれを自動的に取得できるため、一般的なフレームワークはそのまま動作します。
クイックチェック
ネイティブイメージの動的機能についての理解度を確認してください。
振り返り
動的機能の扱い方を学びました。
- リフレクション、プロキシ、リソース、シリアライズ、JNIは静的解析から見えません。
- 到達可能性メタデータのJSONファイルで、これらをnative-imageに宣言します。
- トレーシングエージェントは、実際のJVM実行から設定を自動生成します。
- すべてのコードパス(特にテスト)を実行して、見落としがないようにします。
- 人気のあるライブラリには共有メタデータリポジトリを使用します。
よくある質問
「リフレクションと設定」レッスンは無料ですか?
はい。「リフレクションと設定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「リフレクションと設定」で何を学びますか?
動的機能に対応します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「リフレクションと設定」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GraalVM とは
- ネイティブイメージのビルド
- リフレクションと設定
- ネイティブイメージのトレードオフ