第17章. リフレクション、あるいは "クラスという名のクラス"
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
17.0 はじめに
クラスjava.lang.Class とリフレクション・パッケージjava.lang.reflect は、Java仮想マシンから情報を収集するための多くのメカニズムを提供する。リフレクションと総称されるこれらの機能により、その場でクラスをロードしたり、クラス内のメソッドやフィールドを発見したり、それらのリストを生成したり、動的にロードされたクラス上のメソッドを呼び出したりできる。プログラムの実行中に、クラスをゼロから(実際には、バイト配列から)構築できる仕組みさえある。これは、Javaが、Javaマシンの魔法のような秘密の内部構造に近づけるのとほぼ同じである。
JVM自体は、通常はCやC++で書かれた大規模なプログラミングで、Java仮想マシンの抽象化を実装している。OpenJDKや他のJVMのソースをインターネット経由で入手することができ、何ヶ月も勉強することができる。ここでは、JVMの機能を使用するプログラマの観点から、ほんのいくつかの点に焦点を当てる。
既存のクラスを動的にロードすることから始め、クラスのフィールドとメソッドのリストとメソッドの呼び出しに移り、最後にClassLoader 。Javaの興味深い側面の1つであり、その柔軟性(昔のアプレット、サーブレット、Webサービス、その他の動的API)を説明するものであると同時に、かつてはその速度の問題の1つであると認識されていたものでもある、動的ロードの概念である。例えば、最も単純な "Hello, Java "プログラムでさえ、HelloJava クラスのクラスファイル、その親クラス(通常はjava.lang.Object )のクラスファイル、PrintStream のクラス(System.out を使用したため)、PrintStreamの親のクラス、IOException とその親、などをロードしなければならない。これを実際に見るには、次のようにしてみよう:
java -verbose HelloJava | more
別の例を挙げると、アプレットが流行っていた頃、ブラウザーはアプレットのバイトコード・ファイルをインターネット経由でダウンロードし、デスクトップ上で実行した。どのようにして実行中のJVMにクラス・ファイルをロードするのだろうか?このちょっとしたJavaマジックについては、レシピ17.4で説明する。この章の最後には、JDKツールjavapの代替バージョンと、Java API全体への自分だけのリファレンスを公開することで有名なJava作者になるために使える相互参照ツールが紹介されている。
17.1 クラス記述子を取得する
問題
クラス名やインスタンスからClass オブジェクトを取得したい。
解決策
コンパイル時に型名がわかっていれば、コンパイラ・キーワード.class を使ってクラス・インスタンスを得ることができる。このキーワードは、コンパイル時にわかっている型であれば、8つのプリミティブ型であっても機能する。
そうでなければ、オブジェクト(クラスのインスタンス)があれば、java.lang.Object メソッドgetClass() を呼び出し、そのオブジェクトのクラスのClass オブジェクトを返すことができる(今のは口が裂けても言えない!): ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access