この記事では、java に関する関連知識を提供します。主に、リフレクションとは何か、リフレクションでできること、リフレクション関連の API など、リフレクション メカニズムに関連する問題を紹介します。皆さんが知っていることを願っています。助けるために。
推奨学習: 「java 学習チュートリアル 」
1. リフレクションとは何ですか?
Java 開発における非常に重要な概念は Java リフレクション メカニズムであり、これも Java の重要な機能の 1 つです。
リフレクションの概念は、1982 年にスミスによって最初に提案されました。これは主に、プログラムが自身の状態や動作にアクセス、検出、変更する能力を指します。リフレクションを通じて、プライベート メソッドとプライベート プロパティを呼び出すことができます。一部のフレームワークでは、リフレクションの原理も使用されます。
リフレクション (リフレクション) は 動的言語 の鍵とみなされます。リフレクション メカニズムにより、プログラムは実行中にリフレクションを利用して任意の
クラスの内部情報を取得できます。 API を使用し、任意のオブジェクトの内部プロパティとメソッドを直接操作できます。
クラスには、メンバー変数、メソッド、コンストラクターなどの複数のコンポーネントがあります。リフレクションとは、クラスをロードし、クラスのさまざまなコンポーネントを分析することです。
2. リフレクションで何ができるでしょうか?
Java のリフレクション メカニズムはクラスの基本構造を認識しており、この Java クラスの構造を検出できる機能は、Java クラスの「自己検査」と呼ばれます。たとえば、Eclipse では、ワンクリックでコンパイル ツールがオブジェクトで使用できるすべてのメソッドとプロパティを自動的にリストし、ユーザーが選択できるようにします。これは、Java リフレクションの原理を使用して、作成したオブジェクトを検出し、自己検査します。
リフレクションでできること:
実行時にオブジェクトが属するクラスを決定する; - 実行時に任意のクラスのオブジェクトを構築する;
-
実行時に任意のクラスのメンバー変数とメソッドを決定する; - 実行時に一般的な情報を取得する;
- 実行時に任意のオブジェクトのメンバー変数とメソッドを呼び出す;
- 注釈は実行時に処理されます;
- 動的プロキシを生成します;
-
3. リフレクション関連の API
- java .lang.Class
:リフレクションのソース
##java.lang.reflect.Method- :Method
java.lang.reflect.Field- : 属性
java.lang.reflect.Constructor- : コンストラクター
…
- 4. クラス class の理解
(1) はじめに:
プログラムが javac.exe コマンドを渡すと、1 つ以上のバイトコード ファイル (.class で終わる) が生成されます。次に、java.exe コマンドを使用して、特定のバイトコード ファイルを解釈して実行します。特定のバイトコード ファイルをメモリにロードすることと同等です。このプロセスは
クラスローディング
と呼ばれます。メモリ上にロードされたクラスをランタイムクラスと呼び、このランタイムクラスはClassのインスタンスとして使用されます。 つまり、Class のインスタンスは実行時クラスに対応します。
メモリにロードされたランタイム クラスは、一定期間キャッシュされます。この時間内に、さまざまな方法
でこのランタイム クラスを取得できます。
(2). クラスの読み込みプロセス:
読み込み: 新しいオブジェクト内または、
Class.forName("パッケージ名.クラス") を使用します。
クラス ローダー (ClassLoader)
がクラスをメモリにロードし、クラス オブジェクトを作成します
Class オブジェクトを取得する方法は?
Class.- class
Object 。 - getClass()
Class.forName- ("パッケージ名.Class");
##リンク:
リンクによって行われる作業は主に、バイトコードが正当であるかどうかを確認し、静的メモリ領域を割り当て、それを初期化することです (実際の初期化ではなく、単なる初期化です)対応するタイプの変数にデフォルト値を与えます (int から 0、double から 0.0 など)
アンロード:
メモリからアンロード (アンインストールするタイミングを気にする必要はありません。アンインストールは JVM によって行われます)(3) クラス ローダー
クラス (CLASS) は実行のみ可能ですJVM にロードされた後。指定されたプログラムを実行すると、JVM は要件と特定のルールに従ってコンパイルされた .class ファイルをメモリにロードし、それを完全な Java アプリケーションに編成します。このロード プロセスはクラス ローダーによって完了します。具体的には、ClassLoader とそのサブクラスによって実装されます。クラスローダー自体もクラスであり、その本質はクラスファイルをハードディスクからメモリに読み取ることです。
クラスローダーの分類:
-
BootStrap:
は主に、コア クラス ライブラリ (java.lang.*
など) のロードと ExtClassLoader
および # の構築を担当します。 ##APPClassLoader;
- ExtClassLoader:
主に jre/lib/ext ディレクトリに拡張された jar パッケージをロードする役割を果たします;
- AppClassLoader:
主にアプリケーションのメイン関数クラスをロードします (自分で作成した Java ファイルはこのクラス ローダーによってロードされます);
System.out.println("app:" + System.getProperty("java.class.path"));
System.out.println("ext:" + System.getProperty("java.ext.dirs"));
System.out.println("----bootstrap---");
String[] str = System.getProperty("sun.boot.class.path").split(";");
for (String s : str) {
System.out.println(s);
}
親の委任 (ディスパッチ) メカニズム:
Hello.class のようなファイルをロードする場合。カスタム クラス ローダーに関係なく、まず AppClassLoader にロードされているかどうかを確認します。ロードされている場合は、再度ロードする必要はありません。そうでない場合は、親ローダーが取得され、親ローダーのloadClassメソッドが呼び出されます。同様に、親クラスはまずロードされているかどうかを確認し、ロードされていない場合は上に進みます。この再帰的なプロセスに注意してください。Bootstrap classLoader に到達するまでは、クラスローダーがロードされているかどうかをチェックしており、それ自体でロードすることは選択しません。 BootstrapClassLoader までは親ローダーが存在しないので、この時点でロードできるかどうかを検討し、ロードできない場合は子ローダーに沈んで最下層までロードします。ローダーがロードできない場合は、ClassNotFoundException がスローされます。それで、次のような質問を持っている人はいますか?
なぜこのメカニズムを設計する必要があるのですか?
この設計の利点の 1 つは、システム レベルのクラス String.java を置き換えたい場合に利用できることです。このメカニズムでは、これらのシステム クラスは Bootstrap classLoader によってロードされています (なぜですか? クラスをロードする必要がある場合、最初にロードしようとするのは BootstrapClassLoader だからです)。機会があれば、危険なコードの埋め込みをある程度防ぐことができます。
推奨学習:「
Java チュートリアル」
以上がJAVAのリフレクションの仕組みを理解できるようにする(概要の共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。